Merkwürdiges Verhalten von Portpins ATmega8-16P

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Merkwürdiges Verhalten von Portpins ATmega8-16P

      Hallo!

      Nachdem ich schon mehrfach was machte mit diversen I²C-Geräten (meißt auf Basis von ATmega16, 32, 644 und zuletzt vermehr mit einem NANO (ATmega328P), was bislang auch immer auf Anhieb klappte, bringt mich jetzt ein alter ATmega8-16P zur Verzweifelung.

      Eine Evaluation eines QN8007B wofür ich aufgrund des Gehäuses (QFN24) eine entsprechende Platine brauchte - ein Anschluss an einen NANO o.ä. machte keinen Sinn.
      Also zeichnete ich eine Platine die den QFN24 nebst Periferie trägt, sowie einen µC den ich seit Jahren noch unbenutzt liegen hatte.
      Die Wahl viel auf den ATmega8-16P im DIP-28.

      Platine fertig, es gelang mir auch mit SMD-Schablone und Heißluft den winzigen QFN24 ordentlich drauf zu bekommen.
      Es scheitert aber nun am ATmega8:

      Verwendet wird Pin 27 (PC4) als SDA und Pin 28 (PC5) als SCL - das sind die Hardware-I²C-Pins laut Datenblatt.
      Das dumme ist:
      Nach dem booten sind SDA und SCL korrekter weise auf High 3,3V (externe PullUps mit 4k7).
      Sende ich aber einen I²C-Befehl dann wechselt wahlweise SDA oder SCL (relativ zufällig, aber immer einer von beiden) auf Low und verharrt dort.
      Eben mit Oszi genau geschaut:
      Bis auf diesen Wechsel einer der I²C-Leitungen von High auf Low passiert am I²C-Bus sonst gar nix:
      Keine 100kHz SCL, eine Daten an SDA
      Der Quelltext sieht nach etlichen Versuchen entsprechend aus - zum Teil ist an den auskommentierten Stellen aber zu erkennen was ich schon alles versucht habe.

      Nur soviel:
      Taste 2 führt zur Sub mit dem I²C-Adress-Scanner,
      Taste 3 soll die 28 Register des QN8007b auslesen (I²C-Adresse h56 (write) / h57 (read).

      Der I²C-Scanner erkennt alle 128 Readadressen die es gibt weil er angeblich jedes mal ein Ack erkennt.
      Taste 3 hängt sich manchmal komplett auf (auch der Watchdog hilft da nicht), oder ließt alle Register entweder mit hFF oder h00.
      Eben abhängig welche der beiden Leitungen auf GND gezogen wird.

      Da die PullUps näher am QN8007B sind als am µC konnte ich eben den Spannungsabfall messen:
      Die Leitung welche nach Low wechselt (entweder SDA oder SCL) hat am Portpin saubere 0V, gegenüber am QN8007B sowie am PullUp noch Restspannung von verrauschten 8-9mV.
      Es ist also definitiv der µC der da unkontrolliert nach GND zieht, nicht der QN8007B!

      BASCOM-Quellcode

      1. 'Test V1.0 EVAL-QN8007B UKW-Transmitter.
      2. 'Achtung: Der 3,3V-Regler für den QN8007 fehlt noch. Auf 3,3V kann das Board nur ohne LCD betrieben werden!
      3. '$Regfile="m8adef.dat"
      4. $Regfile="m8def.dat"
      5. $Crystal=11059200
      6. $hwstack=40
      7. $swstack=16
      8. $framesize=32
      9. $baud=38400
      10. $LIB "I2C_TWI.LBX"
      11. DDRB=&B00001001 'MSB sind Inputs, LSB sind Outputs
      12. 'ddrc=&B11111111 'Alles sind Outputs
      13. DDRD=&B11000010 'nur drei Outputs, sonst alles Inputs
      14. config portb=&B11000110 'PullUps nur bei zwei MSB
      15. 'config portc=&B00110000 'PullUps alle aus
      16. config portd=&B00000000 'PullUps nur für Taster und INT
      17. config watchdog = 2048
      18. config debounce = 100
      19. portb.2=0
      20. portb.1=0
      21. config SDA = portc.4
      22. config SCL = portc.5
      23. config Twi = 100000
      24. i2cinit
      25. dim reg as byte
      26. dim i as byte
      27. dim Wert(29) as byte
      28. config base = 0
      29. Dim Slaveadresse As Byte 'Adressvariable für Suchlauf
      30. 'gosub bootmeldung
      31. 'config lcdpin = Pin, db4= PC.3 , db5= PC.2 , db6= PC.1 , db7= PC.0 , E= PD.7 , RS= PD.6
      32. 'config lcd = 16*2
      33. 'wait 10
      34. 'initlcd
      35. 'wait 1
      36. do
      37. waitms 250
      38. 'debounce pind.2 , 0 , QNint 'Auswertung QN-INT
      39. debounce pind.3 , 0 , S1mode 'Auswertung Taste S1 (Mode)
      40. debounce pind.4 , 0 , S2up 'Auswertung Taste S2 (Up)
      41. debounce pind.5 , 0 , S3down 'Auswertung Taste S3 (Down)
      42. waitms 250
      43. reset watchdog
      44. loop
      45. bootmeldung:
      46. print "EVAL-Board QN8007"
      47. print "V1.0 Test"
      48. return
      49. QNint:
      50. print "INT vom RDS-Modul QN8007"
      51. return
      52. S1mode:
      53. print "S1 Mode gedrückt!"
      54. pinb.2 = 1
      55. Pinb.1 = 1
      56. return
      57. S2up:
      58. print "S2 Up gedrückt!"
      59. Pinb.2 = 0
      60. pinb.1 = 0
      61. Print "I2C Slaves suchen..."
      62. Wait 10
      63. For Slaveadresse = 1 To 255 Step 2 ' für alle geraden Adressen
      64. I2cstart 'Startbedingung senden
      65. I2cwbyte Slaveadresse 'Addresse senden
      66. If Err = 0 Then
      67. Print "ACK!" 'I2C-Slave gefunden?
      68. Print "Slave dec: " ; Slaveadresse 'Dezimalwert ausgeben
      69. Print "h" ; Hex(slaveadresse) ; " b" ; Bin(slaveadresse)
      70. Wait 2
      71. End If
      72. I2cstop 'Bus freigeben
      73. Next
      74. 'Cls
      75. Print "Ende Scan"
      76. Wait 2
      77. return
      78. S3down:
      79. print "S3 Down gedrückt!"
      80. print "Lese QN8007 aus:"
      81. i2cstart
      82. i2cwbyte &h57
      83. i2cwbyte &h00
      84. i2crbyte wert(0) , Ack 'Lese Register h00
      85. i2crbyte wert(1) , Ack 'Lese Register h01
      86. i2crbyte wert(3) , Ack 'Lese Register h02
      87. i2crbyte wert(4) , Ack 'Lese Register h03
      88. i2crbyte wert(5) , Ack 'Lese Register h04
      89. i2crbyte wert(6) , Ack 'Lese Register h05
      90. i2crbyte wert(7) , Ack 'Lese Register h06
      91. i2crbyte wert(8) , Ack 'Lese Register h07
      92. i2crbyte wert(9) , Ack 'Lese Register h08
      93. i2crbyte wert(10), Ack 'Lese Register h09
      94. i2crbyte wert(11), Ack 'Lese Register h0A
      95. i2crbyte wert(12), Ack 'Lese Register h0B
      96. i2crbyte wert(13), Ack 'Lese Register h0C
      97. i2crbyte wert(14), Ack 'Lese Register h0D
      98. i2crbyte wert(15), Ack 'Lese Register h0E
      99. i2crbyte wert(16), Ack 'Lese Register h0F
      100. i2crbyte wert(17), Ack 'Lese Register h10
      101. i2crbyte wert(18), Ack 'Lese Register h11
      102. i2crbyte wert(19), Ack 'Lese Register h12
      103. i2crbyte wert(20), Ack 'Lese Register h13
      104. i2crbyte wert(21), Ack 'Lese Register h14
      105. i2crbyte wert(22), Ack 'Lese Register h15
      106. i2crbyte wert(23), Ack 'Lese Register h16
      107. i2crbyte wert(24), Ack 'Lese Register h17
      108. i2crbyte wert(25), Ack 'Lese Register h18
      109. i2crbyte wert(26), Ack 'Lese Register h19
      110. i2crbyte wert(27), Ack 'Lese Register h1A
      111. i2crbyte wert(28), Nack 'Lese Register h1B
      112. i2cstop
      113. waitms 500
      114. 'for i = 0 to &h28
      115. 'i2crbyte Wert(i) , ack
      116. 'next
      117. 'i2cstop
      118. print "QN8007 Register h00-h1F gelesen:"
      119. for i = 0 to 28
      120. print "Register h"; Hex(i) ; " Inhalt h"; Hex(Wert(i)); " b"; Bin(Wert(i))
      121. next
      122. return
      Alles anzeigen

      Im Anhang ein Bild meiner Platine.

      Hat da jemand nen Tip für mich was da im ATmega8 dazwischen funkt? Im Datenblatt habe ich nix gefunden bezüglich aktivierter Zweitfunktionen an diesen Ports.

      Jürgen
      Dateien
    • Ich lese da 2 Punkte die mich stutzig machen.
      • SDA und SCL liegt auf 3V3. Wieviel Volt bekommt der Atmega8? Der läuft normalerweise nur mit 5 V, es sei denn du hast den Atmega8-a oder den Atmega8L-Type.
      • Ist die Quarz-Frequenz korrekt: $Crystal=11059200?
      Soweit ich weiß, müssen die Pins SDA und SCL mit Config angegeben werden - auch bei verwendung der Hardware-I2C.
      Kaum macht man es richtig - und schon geht's!
    • Hallo!

      Mitch64 schrieb:

      Ich lese da 2 Punkte die mich stutzig machen.
      • SDA und SCL liegt auf 3V3. Wieviel Volt bekommt der Atmega8? Der läuft normalerweise nur mit 5 V, es sei denn du hast den Atmega8-a oder den Atmega8L-Type.
      • Ist die Quarz-Frequenz korrekt: $Crystal=11059200?
      Soweit ich weiß, müssen die Pins SDA und SCL mit Config angegeben werden - auch bei verwendung der Hardware-I2C.

      Punkt 1 ist so: Gedacht war das Board für 5V für den µC und 3,3V für den QN8007B, da dieser bis "absolut Max 3,6V" spezifiziert ist.
      Da ich aber den 3,3V-Regler in SOT-23 vorgesehen hatte und erst kürzlich bemerkte das ich davon keinen mehr hatte, hab ich den gelben Draht als Vcc-Brücke genommen und den µC ebenfalls mit 3,3V versorgt.
      Zumindest die UART hat auch mit 38400Bd absolut problemlos funktioniert.

      Aber egal...auf deinen Hinweis das der Mega8 5V braucht habe ich eben einen MCP1700 in TO-92 statt der Brücke draufgelötet.
      Nun hat der µC saubere 5V und der QN8007B inklusive der I²C-Pullups saubere 3,3V.

      Ändert aber am Effekt nix:
      Alleine Tastenfunktion 2: I²C-Scanner:
      Erkennt wieder für jede Adresse ein Ack.
      Sehr merkwürdig.

      Die Quarzfrequenz ist korrekt:
      11,0592MHz ist ein Baudquarz um auch bei höheren Baudraten korrekte UART-Kommunikation zu garantieren.
      Läuft aktuell mit 38400Bd, soll aber später auf 115200Bd.

      Grüße

      Jürgen
    • DG7GJ schrieb:

      Nun hat der µC saubere 5V und der QN8007B inklusive der I²C-Pullups saubere 3,3V.
      Dann sollte aber ein Level-shifter dazwischen, da du nun aber schon alles sauber verlötet hast ist das schwierig. Hast du nicht vorher mit einem Versuchsaufbau die Funktion testen können? Oder ist die Platine von anderen OM's , welche die fehlerfreie Funktion derselben bestätigen können? Die sieht recht professionell gemacht aus.
      PS: Oder es ist beim Auflöten des QFN-Chip was schief gelaufen.
    • Ich dachte bei I2C werden die pullups nur nach gnd gezogen, ein high an einen pin gibt's nicht aktiv vom port sondern nur vom pullup. Wenn die pullups an 3,3V sind sollte das für den 5V mega doch auch als high reichen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo!

      Pluto25 schrieb:

      Zum lesen sollte es

      i2cwbyte &h56 heißen.
      Mitnichten. Der QN8007B hat folgnde Adressen:
      &h56 = Write
      &h57 = Read

      oscar schrieb:


      Dann sollte aber ein Level-shifter dazwischen, da du nun aber schon
      alles sauber verlötet hast ist das schwierig. Hast du nicht vorher mit
      einem Versuchsaufbau die Funktion testen können? Oder ist die Platine
      von anderen OM's , welche die fehlerfreie Funktion derselben bestätigen
      können? Die sieht recht professionell gemacht aus.
      PS: Oder es ist beim Auflöten des QFN-Chip was schief gelaufen.

      Level-Shifter...ja, habe ich die letzten Jahre immer und überall eingesetzt. Speziell bei I²C aber knicke ich mir das...seit dem ich I²C endlich verstanden habe. Und zwar der Punkt das auch Master dort keinen Push-Pull machen, sondern ebenso wie die Slaves nur Open-Dran nach GND schalten.

      Die Platine gibt es bislang nirgendwo anders. Ist von mir selber entworfen und anschließend industriell gefertigt worden.
      Den QFN24 wollte ich nicht mehr mit losen drähtchen auf ein Steckboard patchen, um sowas überhaupt löten zu können braucht es eine ordentliche Platine mit exakt passendem Footprint und Lötstop.
      Das sieht dann natürlich so aus - wobei der professionelle Look leicht über den Zweck hinwegtäuscht:
      Es soll eben nur ein reines Evaluationsboard für diesen QN8007B sein.
      Genauer: Experimente bezüglich RDS-Daten und TMC.

      Und was das löten von QFN24 angeht:
      Jawoll...einfach war gestern!
      Trotz SMD-Schablone und vorsichtiges aufrakeln der Lötpaste - was vom Druck her absolut sauber aussah, merkte ich nach dem auflöten das da etwa doppelt soviel Lötpaste drauf kam als gut gewesen wäre.
      Aber kein Beinbruch:
      Alle vier Seiten nachgearbeitet mit Flußmittel und feiner entlötlitze.
      Bis alle 24 Kontakte absolut korrekt aussahen.
      Kurzschlüsse konnte ich anschließend keine messen.


      Ganz generell aber ein Nachtrag:
      Aufgrund des Hinweises gestern von Mitch64 habe ich da einen 3,3V-Regler nachgerüstet...zuerst ohne erfolg.
      Nach einigen Retests (wegnehmen der Betriebsspannung) plötzlich einen erfolg:

      Taste 2, der I²C-Scanner führt zum selben Problem wie vorher. Ein Signal bleibt beständig auf 3,3V, das andere schaltet dauerhaft auf Low, SDA oder SCL rein zufällig.
      Taste 3 hingegen funktioniert ohne weitere Änderungen.
      Es werden zuverlässig alle gewünschten Register des QN8007B ausgelesen.

      Scheinbar lag es tatsächlich daran das der ATmega8-18P mit den 3,3V nicht anständig kler kam.
      Mit sauberen 5V geht es nun.

      Jürgen
    • DG7GJ schrieb:

      Scheinbar lag es tatsächlich daran das der ATmega8-18P mit den 3,3V nicht anständig kler kam.
      Der kann durchaus mit 3,3V klarkommen aber dann eben nicht mit 11MHz Takt(siehe Daqtenblatt).

      DG7GJ schrieb:

      Und zwar der Punkt das auch Master dort keinen Push-Pull machen, sondern ebenso wie die Slaves nur Open-Dran nach GND schalten
      Kein Problem bei so kurzen Entfernungen und wenn kein Kabel (die Leitungskapazitäten sind schädlich) dazwischen ist oder dann eben niederohmige Pull-Up Widerstände verbauen.
    • oscar schrieb:

      DG7GJ schrieb:

      Scheinbar lag es tatsächlich daran das der ATmega8-18P mit den 3,3V nicht anständig kler kam.
      Der kann durchaus mit 3,3V klarkommen aber dann eben nicht mit 11MHz Takt(siehe Daqtenblatt).
      Seit mehreren Jahren laufen bei mir diverse ATMEGA8/32/328/644 bei 3,3V und 12-16 MHz. Bisher hatte ich damit keine Probleme. Es kann aber gut sein, dass es von Quarz zu Quarz (bzw. Resonator) in Kombination mit den verwendeten Kondensatoren (15...22pF) mal nicht reich zum Anschwingen.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Es gibt von Früher her noch die ATMega, die nur mit 5V liefen. Dann gabs die Variante mit L, die liefen auch mit 3,3V, aber nur bis 8MHz Takt.
      Die Aktuellen ATMegas haben ein a hinten dran, die können beides, aber mit der Frequenz muss man trotzdem aufpassen.
      Je kleiner VCC desto geringer ist der Takt.

      Wenns funktioniert, ok, aber nach Spezifikation ist es nicht.
      Kaum macht man es richtig - und schon geht's!
    • Servus!

      Ja, genau das war die Ursache allen Übels:

      Als ich mir zwischen diversen anderen Platinen-Projekten entschied mal schnell dieses Board für den QN8007B zu zeichnen, grübelte ich kurz darüber welchen µC ich denn dafür nehmen könnte.
      Normaler weise mache ich seit jahren nur noch mit 328 und 644/1284 rum, die fast alle 1,8-5V können.

      Meine Entscheidung viel leichtfertiger Weise auf den Mega8-16P den ich aus meiner Einstiegszeit vor vielen Jahren kaufte, aber bislang nicht benutzt hatte.
      Ein ebenso flüchtiger und falscher Blik ins falsche Datenblatt (Mega8A) sah gut aus. Dummer weise aber passt der Mega8-16P aber nicht zum Datenblatt.

      Nunja - jetzt mit satten 5V rennt er ja, wenngleich ich inzwischen an anderer Stelle meine leichtfertige Entscheidung bereuhe.
      Mal eben ein kleines Menue geschrieben für die S1-Taste...und schon 53% des Flash's belegt...
      Da muss ich die Tage mal gucken wie ich das angehe.

      Jürgen
    • Das stimmt schon, nicht alles lässt sich übertakten. Neuzeitliche MCs sind sehr tolerant (man könnte auch Reserve nennen) bzgl. Spannungsversorgung und Systemtakt.
      Das machbare hole ich mir immer aus dem Datenblatt des betroffenen Chips. Hab auch noch eine große Menge an AT90S4433, die sind auch steinalt und „lahm“...
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.