Liste der Anhänge anzeigen (Anzahl: 1)
Timer0 Overflow Interrupt löst nicht aus (ATmega16)
Weis gerade nicht mehr weiter.
Versuche die AppNote AVR304: Half Duplex Interrupt Driven Software UART
auf einem ATmega16 zu implementieren (Ich weis das ATmega16
Hardware-UART hat, muß aber später auf einen Tiny umsteigen)
Nun zu meinem Problem:
Ich kann weder Zeichen senden, noch empfangen. Zumindest erscheint am
Terminal nichts (habe Hyperterminal und Tera Term ausprobiert).
Einstellungen sind/waren jeweils 38400 Baud, 8 Datenbits, 1 Stopbit,
kein Paritätsbit, keine Flusssteuerung.
Für die Übertragung nutze ich die RXD/TXD Pins (richtig gesteckt ;-))
und den RS232 Spare Port auf dem STK500. Dann gehts weiter an den COM2 Port meines PC's.
Als Clock benutze ich jetzt die STK500 @3.686 MHz.
Fuse (Ext. Clock; Start-up time: 6 CK + 0 ms; [CKSEL=0000 SUT=00]) und
Jumper (XTAL1 Jumper mounted, OSCSEL auf default) auf dem STK500
sollten laut "Help" (AVR Tools User Guide) richtig gesetzt sein.
Nutze den mitgelieferten C-Code von Atmel und compile mit IAR Embedded Workbench Kickstart.
Die Software habe ich etwas anpassen müssen (Registerbezeichnungen,
etc.). Habe zusätzlich ein paar Zeilen, die LED auf dem STK500 blinken lässt (zum testen) geschrieben, welche in der Overflow Interrupt-Routine ausgeführt werden sollten.
Leider wird diese aus mir unerklärlichen Gründen nie ausgeführt.. bin mir aber eigentlich schon sicher, das ich den Timer0 richtig initialisiert habe.
Please Help, weis nicht mehr weiter O:)
Thx !
Hab den Quellcode mit angehängt !
In main() sollte testweise nur ein "Hallo" ans Terminal gesendet werden..
Liste der Anhänge anzeigen (Anzahl: 1)
Versteh ich jetzt nicht so ganz, wie du das meinst mit den Steuerzeichen...
Hab die RX Routine mal rausgeschmissen. Auch die Initialisierung des externen Interrupts.
Die Zeile:
if(!(glob.u_status&TD)) // Transmit section
in der ISR hab ich ebenfalls raus, da ja nicht mehr geprüft werden muß, ob TX oder RX.
Funktionieren tuts trotzdem net, auch kein blinken oder so..
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry Mittagessen !! O:)
Mir wären die 3.686 MHz vom Board fürs erste lieber (kann leider keine 16 MHz)
D.h. also für die Einstellungen:
C = 8 (Prescaler)
XTAL = 3.686 MHz
Baudrate = 9600
--> N = Xtal / (BaudRate*C) = 3.686 MHz / ( 9600*8 ) = ~ 48
--> TCNT0 = 256 - N + (14/C) = 256 - 48 + 14/8 = ~ 210
Hier das simple Prog:
Die LED's blinken (noch... :wink:)
Liste der Anhänge anzeigen (Anzahl: 1)
So. Ich hab' mal einfach dazugeschrieben, was ich meine.
Konzept: Pfeif' auf alle Extras. Back to the roots.
der Timer tickt einfach in der Baudrate, (9600 /sec)
(ev. basteln mit preload)
Will man was senden, schreibt man das Zeichen hin, und setzt einen Flag
und den Status "start"
Durch den Flag wird die ISR lebendig und macht je nach Status was anderes
1 x Start Bit
8 x Datenbit
1 x Stop
1 x stopbit stehenlassen, clear flag
Ich kann es hier nicht probieren, vielleicht fehlt wo ein semikolon, ein bißchen Liebe braucht das halt.
Is klar, wie's gemeint ist ?
Liste der Anhänge anzeigen (Anzahl: 1)
So.. kurz Zeit gehabt zu kommentieren und ein paar Baudraten-Einstellungen zu testen. :)
Ab 38400 Baud macht er nimmer mit.. (reicht aber völlig aus, wie ich finde)
Mach mich dann an die Receive-Routinen ran.