hab mal
reingepackt. hat aber leider nichts gebracht.Code:$hwstack = 100 $swstack = 100 $framesize = 60
hm hier kann man zumindest nachlesen, wozu die dinger gut sind. aber brauche ich dir wirklich? das programm ist nicht im geringsten verschachtelt, es kann im schlimmsten fall sein, dass vom main in einen interrupt und von da aus wieder in den andern interrupt springe, oder?
-> MEIN PROJEKTBLOG <-
hab mal
reingepackt. hat aber leider nichts gebracht.Code:$hwstack = 100 $swstack = 100 $framesize = 60
-> MEIN PROJEKTBLOG <-
hmm schade....
Es kann auch sein, dass deine ISR zu lange ist oder sowas und er dadurch die Stacks überlaufen läßt...
Was macht der Simulator?
nun ja die isr für den UART ist schon recht lang geworden... ich werd sie mal kürzen
-> MEIN PROJEKTBLOG <-
Hallo Goblin,
hast Du mal in die Hilfe geschaut, wie das mit Config Serialin funktioniert ?
Da steht nämlich nix davon, das man die ISR selber anlegen muss !
Das macht Bascom schon selber. Und da sind auch Beispiele drin, wie man die ganze Sache benutzt, wichtig ist dabei Ischarwaiting() um zu sehen ob was im Puffer ist.
Das mit dem Bytematch braucht man nur, wenn man auf bestimmte Zeichen wartet, zB. Startbyte o.ä. In der Regel kann man das aber weglassen.
Und für den Fall das die UART-ISR selber gebaut werden sollte, ist es Grundsätzlich eine schlechte Idee da ein Print reinzubauen
Denn Print gibt ja auch über die UART aus, und es kann sein dass sich da dann was überschneidet !
D.H. während das Print 5 Zeichen ausgibt können 5 Zeichen die in der Zeit kommen könnten nicht verarbeitet werden !
linux_80 hat recht!
Was du testen kannst ist: Einen Output-Buffer anlegen.
Das mit dem Print war eh nur zu Debug-Zwecken. Wäre ja irre wenns drinbleiben würde. Aber zurück zum eigentlichen Thema:
Ich hab mein Konzept nochmal überdacht und werde das Bytematch benutzen. In einem Datenstream kommt irgendwann ein Startsymbol und danach sollen die folgenden 12 Bytes gelesen werden. Ich würde also in der Serial0charmatch: nen Flag setzen, damit die Hauptschleife weiß, dass das Startsymbol eingegangen ist. "Ischarwaiting" hab ich mir auch angeschaut und die Funktion ist mir soweit klar. Ich checke in der Hauptschleife also das Flag. Wenns gesetzt ist schau ich mit "Ischarwaiting" in den Buffer. Wenn was drin ist, saug ichs mit inkey() raus. Jetzt ist die Frage: wie sieht der Buffer aus? Was passiert wenn er voll ist? Fliegt dann das älteste Byte wieder raus? Wenn nicht, könne ich ja einfach 12x inkey() machen und hab meine 12 Bytes, egal wieviele danach noch empfangen wurden und danach das Flag zurücksetzen.
-> MEIN PROJEKTBLOG <-
Ich wäre mir da aber nicht Sicher, ob Du mit dem Warten auf das Zeichen auch synchron bist, wenn Du alle Zeichen im Puffer lässt ?
Denn beim auslesen wird immer das älteste Zeichen kommen, nicht unbedingt das was nach dem erkannten Zeichen kommt.
Schau aber mal nach Clear ob man das in der Bytematchroutine anwenden kann.
Und vor jedem einlesen eines Zeichens mit Ischarwaiting abfragen ob das nächste Zeichen schon da ist, die UART ist nicht so schnell wie der µC.
Ja der Plan wäre gewesen: In der Charmatch nen clear aufrufen und dann das flag setzen. Somit ist der Buffer leer unmittelbar nachdem das Startsymbol empfangen wurde und das nächste Zeichen sollte eigentlich dann auslesbar sein.Zitat von linux_80
klar, sonst hält ja inkey() das komplette programm aufZitat von linux_80
-> MEIN PROJEKTBLOG <-
Gut, also ich hab es so versucht, aber die CharMatch-Routine wird auch nicht angesprungen. Hier der neuste Kot - ähm Code:
Hab zu debug-Zwecken in die Interrup-Routine für den Charmatch mal ne PWM-Wert-Änderung eingebaut. Aber nichts tut sich. Wenn ich den Timer0-Interrupt ausmache geht es.Code:$regfile = "m8def.dat" $crystal = 14745600 $baud = 115200 $hwstack = 200 $swstack = 200 $framesize = 200 Config Serialin = Buffered , Size = 20 , Bytematch = 65 Config Timer0 = Timer , Prescale = 1 'Timer0 für 100 Hz Config Portb = Output Config Portc = Output Dim Tmp_b As Byte 'Temp-Register für die Outputs (schneller beschreibbar) Dim Tmp_c As Byte Dim Pointer As Byte 'debug Dim Pwm_cnt As Byte 'Zähler für PWM-Intervall Dim Pwms(12) As Byte 'Array mit PWM-Werten Dim Tmp_pwms(12) As Byte 'temporäres pwm-array Dim Incoming As Byte 'Byte welches über UART gekommen ist Dim Mybytes As Byte 'wieviele signifikante bytes hab ich empfangen 'Dim Bytecnt As Integer 'Wieviele Bytes wurden empfangen? Dim Receiveflag As Bit Mybytes = 0 Receiveflag = 0 Const Slaveid = 0 'Slave-IDs (von 0 bis 24) Const Timervorgabe = 112 'Timerstartwert für korrektes Timing Pwms(1) = 200 'Farbwerte zuweisen (debug) Pwms(2) = 10 Pwms(3) = 10 Pwms(4) = 10 Pwms(5) = 10 Pwms(6) = 10 Pwms(7) = 10 Pwms(8) = 10 Pwms(9) = 10 Pwms(10) = 10 Pwms(11) = 10 Pwms(12) = 10 Waitms 500 Portb.1 = 1 'Takt testen (debug) Waitms 500 Portb.1 = 0 Waitms 500 Portb.1 = 1 Waitms 500 Portb.1 = 0 Waitms 500 Portb.1 = 1 Waitms 500 Portb.1 = 0 Waitms 500 Print 'Debugmessage Print "RGB-Slave...started" Print "Slave-ID..." ; Slaveid Print "Communication...OK" Print On Timer0 Timer_irq 'interruptvektor fuer timer0-interrupt Enable Timer0 'timer0 anschalten Enable Interrupts Timer0 = Timervorgabe 'Main: Do If Receiveflag = 1 Then 'Wenn flag gesetzt ist If Ischarwaiting() = 1 Then 'Test ob neues Zeichen im Buffer Pwms(mybytes) = Inkey() 'Zeichen in PWM-Array Incr Mybytes 'Habe 1 Byte mehr If Mybytes = 12 Then 'wenn ich 12 Bytes habe Receiveflag = 0 'bereit fuer Empfang des naechsten Startsymbols Mybytes = 0 'Mybytes auf 0 End If End If End If Loop 'Getit: Serial0charmatch: Clear Serialin 'buffer loeschen damit platz fuer relevante zeichen ist Receiveflag = 1 'hab startsymbol empfangen Pwms(12) = 200 'debug Return Timer_irq: Timer0 = Timervorgabe Tmp_b = 0 Tmp_c = 0 If Pwms(1) > Pwm_cnt Then Tmp_c = Tmp_c Or 8 'R1 (PORTC.3) If Pwms(2) > Pwm_cnt Then Tmp_c = Tmp_c Or 16 'G1 (PORTC.4) If Pwms(3) > Pwm_cnt Then Tmp_c = Tmp_c Or 32 'B1 (PORTC.1) If Pwms(4) > Pwm_cnt Then Tmp_c = Tmp_c Or 1 'R2 (PORTC.0) If Pwms(5) > Pwm_cnt Then Tmp_c = Tmp_c Or 2 'G2 (PORTC.1) If Pwms(6) > Pwm_cnt Then Tmp_c = Tmp_c Or 4 'B2 (PORTC.2) If Pwms(7) > Pwm_cnt Then Tmp_b = Tmp_b Or 8 'R3 (PORTB.3) If Pwms(8) > Pwm_cnt Then Tmp_b = Tmp_b Or 16 'G3 (PORTB.4) If Pwms(9) > Pwm_cnt Then Tmp_b = Tmp_b Or 32 'B3 (PORTB.5) If Pwms(10) > Pwm_cnt Then Tmp_b = Tmp_b Or 1 'R4 (PORTB.0) If Pwms(11) > Pwm_cnt Then Tmp_b = Tmp_b Or 2 'R3 (PORTB.1) If Pwms(12) > Pwm_cnt Then Tmp_b = Tmp_b Or 4 'R3 (PORTB.2) Portc = Tmp_c Portb = Tmp_b Incr Pwm_cnt 'Pwm_cnt incrementieren und lustig überlaufen lassen Return
-> MEIN PROJEKTBLOG <-
Lesezeichen