PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : uart interrupt routine



Computerkora
24.11.2006, 21:44
Hallo zusammen,

nach etlichen Jahren habe ich wieder begonnen ein Programmierprojekt umzusetzen.
Kurz worum es geht:
Meine Jungs haben eine digitale Autorennbahn, welche einen Aux-port hat, welcher etliche Informationen zur Verfügung stellt.

Ich bin nun dabei, für die Rennbahn eine Startampel, Rundenanzeigeturm (7-Segement) und Großbildschirme (LCD-Display) zu bauen.
Vom Grundkonzept liest der Mainmicrocontroller (Mega8515) die Daten von der Rennbahn und verteilt diese dann über Rs232 an die inteligenten Pheripherieeinheiten (Mega13, Mega8).
Alle Microcontroller werden mit Quarzen (12MHz) befeuert und ich setze den Bascom Compiler ein.
Für die Kommunikation habe ich mit ein 9 Byte langes Protokoll erstellt, wobei ein Startbyte und am Ende ein Prüfsumme übertragen werden sollen. Prüfsumme ist noch nicht umgesetzt, da die grundsätzlich Kommunikation nicht funktioniert. Alle Empfangsroutinen sollten mittels HW Uart und Interrupt Serviceroutinen arbeiten.
Dazu habe ich mir zwei Testprogramme geschrieben bei welchen ich das austesten möchte. Ein Microcontroller sendet permanent, während der andere die Bytes empfangen sollte, auswerten und an den PC weitersenden.
Leider geht das nicht so wie ich mir das vorstelle, vielleicht kann mir jemand einen Tipp geben was ich falsch mache. Habe schon einige Tage jetzt mit diesem Kommunikationsproblem verbracht.

Leider hat die Suche auch nicht den erwarteten Erfolg gebracht. Habe schon etliche Beispielprogramme durchgesehen und mein Buch gibt auch nichts mehr her was weiterhilft - please help me

Anbei meine Testprogramme:

linux_80
24.11.2006, 23:03
Hallo,
was mir als erstes Auffällt, Du arbeitest mit Software UART, damit schauts dann mit Interrupts schlecht aus !
Interrupts kann nur die HardwareUART generieren.

Wie hast Du die RS232-Verkabelung zwischen den Megas gebaut, evtl. gibts da noch ein Hardwareproblem ?!
Was ist wo bei wem angeschlossen (nur was RS232 betrifft) ?

Computerkora
25.11.2006, 09:09
Ich habe einen Mega8 im STK500 (Empfänger) welcher RXD (PD0, Pin2) die Daten empfängt und dann auf einem Software UART wieder sendet (Comd.5). Der Sender ist auf einem Testboard aufgebaut und dort sende ich definitiv mit einem Software UART auf comd.7. Wenn ich den Ausgang von Sender direkt ans PC Terminalprogramm sende, dann kommt alles richtig an. Sobald ich den zweiten Mega8 dazwischenhänge gehts nicht mehr.
Ich möchte/muß nach meinem derzeitigen Wissensstand alle Empfänger mit HW Uart/Interrupt arbeiten lassen, da ich keinen Datenverlust zulassen kann.
Der Mainmicrocontroller muß mit 38400 Baud die Daten von der Rennbahn empfangen und anschließend auf alle Peripheriemegas verteilen.
Die eigentlichen Berechnungen lasse ich dann in den einzelen Peripheriemegas durchführen (Rundenzählen für jeders Auto, Zeitberechnungen und die Anzeigeelemente steuern).

Vorrangig muß ich aber mein Kommunikationsproblem lösen, damit die richtigen Daten beim richtigen Peripherieteil ankommen.

In meiner Testumgebung verbinde ich die Mega8 über Drahtbrücken - das sollte eigenlich funktionieren, da am PC bei weglassen des Empfangsmega der gleich Signalweg funktioniert.

Also die Signalwege würde ich nach derzeitigem Wissenstand ausschließen, den es werden definitiv Daten gesendet und empfangen - das Problem besteht nur darin sie richtig zu empfangen, alle 9 Byte einen Protokollstreams!!!

Ohne Interrupts glaube ich das ich die Empfangsroutienen nicht lösen kann.

lg.
gerhard

linux_80
25.11.2006, 14:00
Ich weiss jetzt nicht ob wir da teilweise aneinander vorbeireden,
was ich oben meinte, bei SoftwareUART gibts einfach keine Interrupts !

Wenn die einzelnen Megas per HW-UART empfangen ist das OK so, evtl. wird aber die SoftwareUART gestört, wenn ein IRQ der HW-UART auftritt.

Was ich grad noch gefunden habe, in einem Testprogramm wird Rx_complete ausgewertet auf 1, das wird aber nie auf 1 gesetzt, deswegen macht es dann auch nicht sonderlich viel !

Wie das Hardwaremässig zusammenhängt kann ich mir immer noch nicht so ganz vorstellen, sind da auch mehrere Controller auf der gleichen Rx- oder Tx-Leitung, oder hat jeder seine eingene ?

Wenn sonst keinem hier was einfällt, kannst Du evtl. das mal kurz aufmalen wo welche Leitung hingeht, und wo HW- und software UART ist !?

Computerkora
25.11.2006, 14:45
Ich habe ein kleine Skizze angefertig, aus welcher vielleicht etwas genauer mein Ansatz hervorkommt.

Der Maincontroller hat nur die Aufgabe die Infos von der Bahn empfangen (mittels HW UART -Interrupt) und anschließend an die entsprechenden Periperiercontroller mittels SW UART zu senden.

Die Periperiecontroller empfangen mittels HW-Uart - (Interrupt), machen die entsprechenden Berechnungen und bringen diese zur Anzeige oder was auch immer zu tun ist.

Wie leicht hilft die Zeichnung, wobei bitte die Ports nur plakativ zu verstehen sind.

lg.
gerhard