PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Config SerialOut & Interrupts?



mikron
19.07.2011, 09:51
Hallo,

vorab: ich bin Einsteiger in die Mikrocontrollertechnik und neu hier in diesem Forum.
Zur Zeit arbeite ich Roland Walters "AVR-Lehrbuch" mit Experimentierboard und ATmega8-16 durch.

Nun habe ich ein kleines Problem mit einer Beispiel-Aufgabe aus dem Buch. Mit folgendem kleinen Listing soll ein Text auf den PC-Bildschirm geschickt werden, während gleichzeitig ein Ton ausgegeben wird.

'0404bas: USART: Senden mit Warteschlange
'Hardware: MAX232 an PD0/PD1, Nullmodemkabel zum PC
'Speaker an Pin PD5
'------------------------------------------------------------
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 3686400 'Quarz: 3,68464 MHz
$baud = 9600 'Baudrate der USART: 9600 Baud

Config Serialout = Buffered , Size = 20 '20 Bytes Warteschlange

Ddrd.5 = 1 'PD5 als Ausgang konfigurieren

Do
If _rs_head_ptrw0 = _rs_tail_ptrw0 Then
Print "Das ist ein Test."
Portd.5 = Not Portd.5 'PD 5 Speakerausgang invertieren
Waitms 1 '1 Millisekunden warten
End If

Loop
End

Leider funktioniert das so nicht. Laut Roland Walter wird mit „Config Serialout“ eine externe Assemblerroutine aus der MCS.LIB für den Interrupt „USART Transmit Complete“ eingebunden und dieser Interrupt eingeschaltet.

Dies scheint jedoch bei mir so nicht zu funktionieren. Erst, nachdem ich zusätzlich vor dem Statement noch den Befehl „Enable Interrupts“ eingebunden habe, funktioniert das Programm.

Meine Frage: Mache ich etwas falsch, oder stimmen die Angaben im Buch nicht? Schaltet die eingebundene Assemblerroutine doch nicht den benötigten Interrupt ein ?

Gruss,
Bernd

PicNick
19.07.2011, 09:56
Vor dem "DO" solltest du noch
Enable Interrupts
schreiben.

Kampi
19.07.2011, 10:17
Damit Interrupts, egal welcher Art, überhaupt funktionieren musst du diese Aktivieren. Dieses "Enable Interrupts" musst du dir wie einen Hauptschalter für alle Interrupts vorstellen. Erst wenn dieser Hauptschalter umgelegt wird (durch Enable Interrupts), kannst du die einzelnen Schalter für Interrupts aller Art (z.B. UART, ADC, usw.) umlegen, wodurch diese aktiviert werden.
Dieses "Enable Interrupts" schreibt man dann normalerweise vor dem eigentlichen Hauptprogramm, weil diese Interrupts ja normalerweise nur 1x aktiviert werden müssen.

mikron
19.07.2011, 10:19
Hallo PicNick!
Danke für die schnelle Reaktion. Wie in meiner Anfrage berichtet, hatte ich dieses Statement bereits eingefügt und es läuft damit.

Mich wundert nur, dass der Verfasser des Lehrbuchs das Listing ohne das Statement zeigt und dazu schreibt, "mit dem Einbinden der Assemblerroutine würde der entsprechende Interrupt automatisch eingeschaltet". Das würde aber bedeuten, dass das explizite Enable gar nicht erforderlich wäre. Kann aber eigentlich nicht sein, denn nur damit läuft das Programm.

Gruss,
Bernd

Kampi
19.07.2011, 10:22
Vielleicht einfach nur ein Druckfehler.

mikron
19.07.2011, 10:23
Hallo Kampi,
auch Dir vielen dank für die schnelle Reaktion. Das klappt ja sehr gut hier in diesem Forum.
Deine Mitteilung traf ein, während ich die für PiNick schrieb.
Ja, genau wie Du schreibst ist auch meine Vorstellung. Dann muss eigentlich der Fehler im Lehrbuch liegen.
Der Verfasser desselben ist zur Zeit in Urlaub, sonst könnte ich ihn ja mal fragen.

Gruss,
Bernd

Richard
19.07.2011, 10:42
Hallo Kampi,
auch Dir vielen dank für die schnelle Reaktion. Das klappt ja sehr gut hier in diesem Forum.
Deine Mitteilung traf ein, während ich die für PiNick schrieb.
Ja, genau wie Du schreibst ist auch meine Vorstellung. Dann muss eigentlich der Fehler im Lehrbuch liegen.
Der Verfasser desselben ist zur Zeit in Urlaub, sonst könnte ich ihn ja mal fragen.

Gruss,
Bernd

Das ist vollkommen normal, solche Fehler kommen immer wieder vor, vor allem wenn der Autor selber Korrektur liest werden eigene Fehler oft übersehen. Kennt glaube ich jeder selber. :-( Ich habe auch schon öfters Fehler in Listings entdeckt, das ist ärgerlich aber eine Korrektur, besonders bei Büchern oder CD's dürfte zu teuer werden. :-(

Gruß Richard

mikron
20.07.2011, 18:51
Hallo

Das Problem ist aufgeklärt:

Ich habe bisher die Listings aus dem Buch fleissig abgetippt und dabei die Bedienung des Bascom-Editors kennengelernt. Jetzt habe ich auf der mitgelieferten Begleit-CD entdeckt, dass für Tippfaule dort auch die Listings aller Übungsaufgaben zum direkten Übernehmen enthalten sind.

Und dort ist im entsprechenden Listing (0404.bas) das fragliche Statement „Enable Interrupts“ enthalten! Im Kommentartext gibt es den Hinweis, dass ab Bascom 1.11.7.7 (ich verwende hier 2.0.5.0).dieses Statement verwendet werden muss, damit es funktioniert. Die Hintergrund-Routine, die eingebunden wird, musste wegen eines Bugs geändert werden. Daher wird auch der Interrupt „USART Transmit Complete“ nicht mehr so eingebunden wie im Buch beschrieben.

Naja, auf alle Fälle hat für mich die Sucherei nach dem Grund, warum es nicht funktionierte einen guten Lerneffekt gehabt, habe ich doch so nebenbei beim Stochern im Internet noch das eine oder andere zusätzlich Interessante gefunden.

Und meiner Meinung zu dem Buch hat es keinen Abbruch getan, ich halte es nach wie vor für eine sehr gute Möglichkeit, in die AVR-Technik einzusteigen.

Gruss,
Bernd.

Kampi
20.07.2011, 19:14
Ahh gut zu wissen :). Ja da kann der Autor des Buches ja nichts für wenn der Code auf Grund eines Bugs geändert werden muss. Es zählt halt der Gesamteindruck des Buches. Und wenn du schon selber sagst das du dabei was gelernt hast wurde der Zweck des Buches ja erfüllt ;)