Hallo ich verwende fastavr als Compiler und möchte mit dem Interrupt
Urxc eine bestimmte aktion durchführen. Also das etwas passiert wenn
etwas an die Serielle Schnittstelle gesendet wird habe ich schon
hinbekommen allerdings scheint das Programm stehen zu bleiben nachdem
der Interrupt Ausgelößt wurde. Was kann ich machen damit er wieder ins
Hauptprogramm zurückkehrt?
:-) hehe ja hast recht hätt ich auch mal drauf kommen können das zu
posten ;-)
also so sieht es aus:
'/////////////////////////////////////////////////////////
'/// FastAVR Basic Compiler for AVR by MICRODESIGN ///
'/// Name of Your project
'/////////////////////////////////////////////////////////
$Device= 4433 ' used device
$Stack = 32 ' stack depth
$Clock = 4 ' adjust for used crystal
$Source=On ' basic source in Asm
$Lcd = PORTB.0, RS = PORTD.3, EN =PORTD.4, 16,2
$Baud = 9600
Dim serial As String*8
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer
Dim g As Integer
Dim h As Integer
Declare Sub main()
Declare Interrupt Urxc()
Enable Interrupts
Enable Urxc
DefLcdChar 0, &h07, &h05, &h07, &h00, &h00, &h00, &h00, &h00
DDRD=&HFF
PORTD.2=1
Sub main()
Do
Start Adc
a = (Adc(0)/2)-276
b = (Adc(1)/2)-278
c = (Adc(2)/2)-278
d = (Adc(3)/2)-276
'Locate 1,1
'Lcd Adc(0)
'Locate 2,1
'Lcd Adc(1)
Stop Adc
Cls
Locate 1,1
Lcd "T1:"
Locate 1,4
Lcd a
Locate 1,6
Lcd Chr(0)
Lcd "C"
Locate 1,9
Lcd "T2:"
Locate 1,12
Lcd b
Locate 1,14
Lcd Chr(0)
Lcd "C"
Locate 2,1
Lcd "T3:"
Locate 2,4
Lcd c
Locate 2,6
Lcd Chr(0)
Lcd "C"
Locate 2,9
Lcd "T4:"
Locate 2,12
Lcd d
Locate 2,14
Lcd Chr(0)
Lcd "C"
WaitMs 150
Loop
End Sub
Interrupt Urxc()
Start Adc
e=Adc(0)
f=Adc(1)
g=Adc(2)
h=Adc(3)
Stop Adc
Print e
Print f
Print g
Print h
End Interrupt
main()
Achso noch eine kleine Anmerkung der Interrupt lässt sich genau ein mal
auslösen. Dann bleibt das Programm stehen...
liegt es vielleicht daran, dass Du das UDR-Byte nicht ausliest, und
deswegen kein neues Empfangen kannst bzw. kein neues Interrupt
ausgelöst wird?
Ich Kenne mich mit dem Compiler leider nicht aus, aber da es Basic sehr
ähnlich sieht, vermute ich, dass da irgendeine Anweisung zum Auslesen
des UDR fehlt...
das kann es eigentlich nicht sein, da fehlendes Lesen von UDR bewirkt,
dass das RXC nicht gelöscht wird, also nach reti + 1 Befehl direkt
wieder ein Rx-Int erfolgen würde.
Mit Basic kenne ich mich aber überhaupt nicht aus, vielleicht mal im
Simulator laufen lassen?
Hallo
Kenne mich mit FastAvr zwar nicht aus, aber probiere mal
"save all" bei der Interrupt Routine.
Vielleicht war es das ja
MFG
Dieter
Hilfe:
When the Interrupt routine is more complex, use Save 2, Save 3 or Save
All.
Natürlich liegst Du mit reti + 1 richtig, nur weiss man ja nicht, wie
der Compiler das Problem löst.
Vielleicht liegt es auch daran, dass die Interruptroutine ziemlich
lang, mehrfach aufgerufen wird und leider zu einem Stack-Überlauf
führt.
Abhilfe wäre ja: Entgegennahme des Interrupt, Flag setzen, im
Hauptprogramm auf Flag reagieren und ADC-Kram ausführen.
Hauptprogramm würde die ganze Zeit nach dem Flag gucken und bei
gesetztem die ADC-Sachen machen, Flag löschen und somit Interrupt
wieder zulassen.
Simulator wäre eine Möglichkeit, ASM-Datei posten eine weitere...
Gruß Rahul
wenn die ständig ausgeführt wird, macht das Sinn - hatte ich schon
geschrieben - um das RxC-zu löschen, muss man UDR lesen. Wenn
Statusbits per Software gelöscht werden sollen, ist i.a. das Schreiben
einer "1" nötig, beim RxC steht das allerdings nicht dabei...
Also lies das UDR.
Hat mal jemand probiert, ob sich das RxC-Bit durch Schreiben einer 1
löschen lässt?
Ich hab es noch nicht ausprobiert. Im Normalfall verwendet man ja auch
die Daten von der seriellen Schnittstelle für irgendwas und nicht nur
zu Triggern eines ADC.
Das einfachste ist UDR auszulesen.