Hallo zusammen! Ich komme bei einem Problem mit BASCOM nicht weiter. Folgendes soll realisiert werden: An einem PIN eines ATmega8 hängt der Statusausgang einer anderen Hardware. Dieser Ausgang gibt Pulse in verschiedenen Folgen aus (siehe Anhang). Diese sollen nun ausgewertet werden und das Programm entsprechend darauf reagieren. Wie macht man sowas? Soll ich den Timer0 nehmen und einfach zählen, wieviel Pulse in 10s da waren? Oder das Ganze mit Timer1 aufbauen, und Zeiten zählen? Aber wie mach ich das dann? Vielleicht hat jemand ein Beispiel dazu. Ich konnte leider nichts dergleichen finden. Gruss, Max
wenn ich das richtig sehe sind die impulse nie kleiner als 1ms! Jetzt könntest du dir mit timer1(16bit) einen overflow von 1ms basteln. In der Timer_ISR musst du dann nur nachschauen ob der Statuspin 1 oder null ist. Wenn der null ist, dann zählste eine die Variable >>aus<< hoch. Ist der pin 1, dann zählte die variable >>ein<< hoch. In der meinschleife musst dann nur noch die variablen auswerten. So alle 10s. Da du aj die beiden variablen hast, bekommst du ein tastverhältnis zwischen an und aus. Wenn du jetzt noch für jeden fall den du bekommmen kannst ein muster hinterlegst, kannste den status ermitteln. Ändert sich das Signal, wenn sich der Status des Moduls ändert? Gruß Tobi
Danke für die Antwort. Ja, der Signal ändert sich mit dem Status des Moduls. Ich versuche es gerade mit dem INT1 Pin des Megas zu realisieren, aber ich komme da einfach nicht weiter. Ich wollte einfach innerhalb von 5 Sekunden die Anzahl der positiven Flanken zählen und dann mit einer Select-Case Anweisung auswerten. Das mit dem Timer1 geht leider nicht, weil der schon mit 100ms für andere Dinge im Programm läuft. Werde es aber mal mit dem Timer0 versuchen, so wie du es beschrieben hast. Max
Das wird nur mit dem prescale knapp bei timer0 Kannste nicht das timing nen runterdrehen? und dann für deine andere funktion warten bis 100 overflows waren? Aber mit dem ext. Interrupt müsste es auch gehen. Ist dann das gleiche wie ich das beschrieben habe nur das die auswert funktion wegfällt. Ich weiss zwar nicht wie sih die signale ändern aber ich könnte mir vorstellen, das es vielleicht 2 oder mehr gleiche status gibt. Probieren geht über studieren.... in diesem sinne noch frohes schaffen Gruß Tobi
Irgendwie komme ich bei der Auswertung nicht weiter. Ich habs jetzt mit dem INT1 versucht und jedesmal, wenn sich die Flanke ändert eine Variable hochzählen lassen. Dann wird nach 3s geschaut, welchen Wert die Variable hat und dementsprechend ausgewertet. Leider funktioniert das nicht so wie es soll. Hier mal ein beispiel
1 | INT1: |
2 | |
3 | if countvar = 0 then |
4 | incr countvar |
5 | timervar = 0 |
6 | elseif countvar >= 1 then |
7 | incr countvar |
8 | end if |
9 | |
10 | if timervar >= 3 and countvar > 1 then |
11 | select case countvar |
12 | case 2: |
13 | 'status1 |
14 | case 6: |
15 | 'status2 |
16 | case 7: |
17 | 'status3 |
18 | end select |
19 | timervar = 0 |
20 | |
21 | elseif timervar >=3 and countvar <= 1 then |
22 | 'status0 |
23 | end if |
24 | |
25 | return |
Welche besseren und genaueren Möglichkeiten gibt es zur Auswertung? Wie aufwendig wäre es, die Pulselängen und Pausen zu ermitteln und auszuwerten? Gruss, Max Wild
Naja also erstmal würde ich den teil der die variable auswertet aus dem interrupt packen. Das braucht zuviel zeit. das kannste lieber in der hauptschleife machen... Aber ich muss zugeben ich verstehe deinen code nicht wirklich... ich würde das komplett anders lösen. Ich würde in den interrupt lediglich reinschreiben:
1 | Int1: |
2 | incr flanke |
3 | return |
dann musste noch in deinem timer1(der laut deiner aussage alle 100ms einen overflow liefert) eine weitere Variable hochzählen.
1 | timer1_isr: |
2 | .... |
3 | incr time_for_status |
4 | .... |
5 | return |
In der mainschleife mussste jetzt nurnoch die beiden variablen verknüpfen. [code] Do .... if time_for_status = 30 then time_for_overflow=0 select case flanke case 0: 'status für flanke=0 case 1: 'status für flanke=1 ..... end select end if ..... loop [/code Gruß Tobi
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.