Forum: Mikrocontroller und Digitale Elektronik Probleme mit Software-UART und mega16 (AppNote AVR304)


von schamp (Gast)


Lesenswert?

Hallo Leutz !

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 eigentlichen 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 ich noch etwas wichtiges übersehen ??
Bin dankbar für jede Hilfe !

Gruß
schamp

von mthomas (Gast)


Lesenswert?

Laeuft der Timer-Interrupt? Timer richtig intitialisiert
(Timing/Interrupt)? Im Zweifel mit LED ("blinken") oder Oszi.
pruefen.

von schamp (Gast)


Lesenswert?

Hab mir ein paar Zeilen für ein "blinkendes" Status LED programmiert
und die auch mal in der Timeroverflow-Interruptroutine ausprobiert
(haben nicht geblinkt, springt also nicht in die Routine). Wird dann
wohl echt an einer falschen Timerinitialisierung liegen..
Wenn net, werd ich morgen mal den Code posten.

Thx einstweilen & einen schönen Abend !!

von schamp (Gast)


Angehängte Dateien:

Lesenswert?

Ich bin mir fast sicher, das der Timer richtig initialisiert ist..
Trotzdem wird irgendwie kein Timer Overflow Interrupt ausgelöst :-(

Hänge mal den Quellcode mit an, vielleicht werdet ihr daraus schlauer.
In Main() sende ich einfach nur ein "Hallo" ans Terminal.
Was mir auch noch beim Debugging aufgefallen ist, das ins TIFR (in der
Funktion uart_init) nicht TOV0 gesetzt wird sondern 0x02 (OCF0).
Es wird aber kein Output Compare Match Interrupt benutzt...
Liegts vielleicht daran ? Wie kann ich das umgehen bzw. ändern ?

von schamp (Gast)


Angehängte Dateien:

Lesenswert?

keiner einen Tipp oder Lösung für das Problem ??
Hab noch einen Screenshot vonner Debugging Session gemacht. Weis nicht,
ob das wirklich an dem TOV0 Overflow Flag liegen kann, das der Timer
nicht richtig initialisiert wird...

Gruß
schamp

von schamp (Gast)


Lesenswert?

Hallo zusammen !

Hab das Programm nochmals "Schritt für Schritt" aufgebaut und
geschaut, wo es hängt. Sobald ich etwas ins TCNT0 Register lade (in der
uart_transmit() die Zeile mit TCNT0 = (256-N+(14/C)); // Set timer delay
to first bit) wird nicht mehr in die ISR gesprungen.
Kann sein, das die Interrupts einfach wieder disabled werden ???
Wenn ich die Zeile testweise auskommentiere wird die ISR durchlaufen
allerdings auch nur einmal.
Kann mir jemand erklären warum dem so ist ?
Die Software sollte doch eigentlich einwandfrei laufen. Denke die Leute
bei Atmel werden sich bei der AppNote schon was gedacht haben und nicht
einfach fehlerbehaftete Software publizieren. Vom eigentlichen Ablauf
und Aufbau des Codes sind für mich auch keine groben Fehler
ersichtlich...
Fällt noch jemanden was diesbezüglich auf ??
Bin für jede Hilfe dankbar !

Gruß
schamp

von Lexele (Gast)


Lesenswert?

Tach Schlamp,

hast Du schon versucht, die Leute von Atmel versucht anzumailen?
Es sind ja auch nur Menschen, es kann durchaus sein, dass ihnen
Fehler unterlaufen...

Eine andere Idee: Vielleicht steht ein anderer Processor in den
Einstellungen,und daher werden falsche Regs gesetzt?

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.