Forum: Mikrocontroller und Digitale Elektronik ATmega32U2 und (fast) nix geht.


von AE (Gast)


Lesenswert?

Hi,
nach 2 Tagen erfolgloser Tests mit einem ATmega32U2 USB Board brauche 
ich mal eure Hilfe:
(Grundsätzliches läuft, wie das Hexfile mit Flip programmieren und zu 
starten und der Bootloader)

Die Richtungsports DDRB und DDRD lassen sich offenbar programmieren, die 
Datenregister auch, da sich Änderungen da bemerkbar machen (an den 
angeschlossenen LEDs)
Die LEDs bleiben an B6 (H-aktiv) und D3 (L-aktiv) aber bei entspechender 
Programmierung nicht statisch ein sondern flackern mit 5-10 Hz.
Nach Reset keine Verhaltensänderung, nach Spannung (Vcc) aus-ein 
allerdings sind sie statisch ein.

Für die Code-Fans:
  .include "m32U2def.inc"

.def temp    = r16
.def leds = r17

main:
         ldi r16, 0xFF
         out DDRb, r16       ; Inhalt von r16 ins IO-Register DDRB 
ausgeben
         out DDRD, r16       ; Inhalt von r16 ins IO-Register DDRD 
ausgeben

         ldi r16, 0b01001011 ; B6 H-aktiv und D3 L-aktiv
         out PORTb, r16      ; r16 ins IO-Register PORTB ausgeben
         out PORTd, r16      ; r16 ins IO-Register PORTD ausgeben
schleife1: rjmp schleife1

Inwiefern spielt da mit rein ob das von AVR studio erzeugte debug oder 
release-Hexfile geladen wird?

Werde morgen mal mit Oszi schauen...

von AE (Gast)


Lesenswert?

Bin nun völlig gefrustet.
Aber auch neue Erkenntisse:
Der Quarz schwingt mit 16 MHz.
Das Flackern ist tatsächlich jedesmal nach dem flashen, das nervt zwar 
aber wenn man es weiß, kurzer Kaltstart und läuft. Kennt das noch wer?
Werde mal morgen probieren ob ein Kleiner Elko auf der Platine was 
bringt, irgendwie siehts nach schief gelaufenem Reset aus.

Was richtig Stress macht und mich schon beim Thema UART ewig Zeit 
gekostet hat, daß offenbar was mit dem Systemtakt was nicht stimmt.
Habe mehrfach ausgerechnet und recherchiert, Theorie und Praxis kommen 
nicht zusammen.
Also 16 MHz Quarz mit einem Prescaler von 1024 macht 15625 Takte pro 
Sekunde. Für 100ms also rund 1562.
ldi     temp, ((1<<CS11)|(1<<CS10));|(1<<WGM12))     ; Teiler 1024
sts     TCCR1B, temp

Lade ich diese 1562 = 0x061A wie folgt in das Compare-Register,
ldi    temp1, 0x06
ldi    temp2, 0x1A
sts    OCR1AH, temp  ;Compare Register beschreiben
sts    OCR1AL, temp2  ;
fängt das den Wert aber erst nach ca 32 Sekunden ein.

Stelle ich den Prescaler auf 1, erfolgt der Compare nach 110ms.
Mir ist völlig schleierhaft wie der interne Takt offenbar bereits so 
niedrig sein sollte - kann doch nicht sein...

von Thomas F. (igel)


Lesenswert?

> ldi    temp1, 0x06
> ldi    temp2, 0x1A
> sts    OCR1AH, temp  ;Compare Register beschreiben
                     ^

Sollte hier nicht temp1 stehen?

von AE (Gast)


Lesenswert?

Ja hast recht. Ist mir beim posten passiert.
Daher kommts nicht.
Es muß am Clock liegen, wie sonst könnte ich Compare-Zeiten von einer 
halben Minute bekommen...
Rechnerisch sind im o.g. Rahmen max. ca. 4 sec möglich

Habe grad nochmal das ganze auf Interrupt-Betrieb umgestellt- (vorher 
war nur Compare-Bit-Polling) aber nix neues....

Kann das Problem möglicherweise von irgendeiner fuse kommen die  der 
USB-Teil im Bootloader braucht? Sollten lt.Datenblatt zwar separat 
laufen aber langsam gehen mir die ideen aus.
(Hab eben beim googeln was ähnlich klingendes entdeckt.)

von AE (Gast)


Lesenswert?

Das im Eingangspost erwähnte Flackern kann ich definitiv verhindern wenn 
bei FLIP das Häkchen neben dem Start Application Kopf weggenommen wird.

(Flackern wenn LED angesteuert wird, bei Timern usw äußert sich das eher 
in nicht erfolgender Compare_Out-Port Toggelei usw.)

Beim Timer hab ich es jetzt empirisch so gelöst daß ich den Prescaler 
auf 8 gestellt habe und CTC Modus eingeschaltet:
  ldi     temp, ((1<<CS11)|(1<<WGM12));|(1<<CS12))     ; Teiler 8
        sts     TCCR1B, temp
Per Compare Interrupt (der netterweise den Zähler auch wieder 
runterstellt)
        ldi     temp, (1<<OCIE1A)      ; OCIE1C: Compare C Match 
INTERRUPT
        sts     TIMSK1, temp
wird dank
  ldi temp, (1<<COM1A0) ;COM1A00: toggeln an OC1A= port c6
  sts     TCCR1A, temp
wenn man es erlaubt mit
  ldi  temp, (1<<DDC6)    ;Ab jetzt kann Port6 toggeln
  out  DDRC, temp
ein prima Kontrollsignal sichtbar an Port c6
Meine 100ms bekomme ich da bei Vorladen von 0x61a8.
Was ganz offensichtlich mit 4 Bit Aufwärtsverschiebung dem theoretisch 
errechneten Wert von 0x061A und damit seinem 16-fachen recht nahe kommt. 
Bedingt durch den niedrigeren Vorteiler ergibt sich ein Systemtakt von 
2MHz

Nachdem ich das Datenblatt nochmal nach Fuses gescannt habe, der Beweis, 
schön versteckt:The device is shipped with the CKDIV8 Fuse programmed.

Danke auch. Jetzt paßt keine einzige Baudrate mehr na danke.

Vielleicht 19,2k mit verdoppelter Geschwindigkeit

Vielleicht hilfts ja jemand.
Ist übrigens ein NooGroove Board aus Amiland. Gabs grade reduziert in 
der doofen Bucht.
Gute N8

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.