Archiv verlassen und diese Seite im Standarddesign anzeigen : Softwareroutine
Nexianer
01.03.2011, 09:13
Hallo alle zusammen,
ich möchte ein kleines programm schreiben was als ahuptprogramm nichts weiter macht als auf eine Eingabe warten. Diese Eingabe soll entweder per RS232 oder durch drücken eines Tasters der an einem pin angeschlossen wird erfolgen. Der jeweilige befehl soll dann einfach nur eine weuitere subroutine aufrufen. sollte 1 std. kein befehl gekommen sein soll eine bestimmte routine aufgerufen werden. und dann das selbe nochmal...
wie löse ich das am besten?
PS: ich arbeite mit bascom
hardware.bas
01.03.2011, 16:09
Eine Frage vorweg. Soll der AVR noch andere Funktionen
während des Waertens auf die Eingabe erfüllen? VG Micha
Nexianer
02.03.2011, 10:49
ne eigentlich nicht....
das ganze geht darum den ladezustand von 2 accus zu überwachen die werte per RS 232 Auszugeben und ggf. den einen oder den anderen accu zu laden.
es soll eine manuelle abfrage per rs 232 möglich sein und ein manuelles umschalten auf laden per rs232 und per taster.
sollte diese anfrage nicht kommen so soll 1 mal pro stunde automatisch die spannung geprüft werden und entschieden werden ob geladen werden muss oder nicht....
hardware.bas
02.03.2011, 21:02
Dann wirst Du um Timer- und Interruptprogrammierung nicht
drumrumkommen. VG Micha
Hi,
wie genau soll die Zeit den sein?
Hier mal ein Beispiel
$regfile = "M168Pdef.dat" 'es handelt sich um einen ATmega168P
$crystal = 3686400 'der eingebauter RC-Oszillator läuft mit 3,6864 Mhz
$hwstack = 100 'im Speicher werden für den Hardware-Stack 100 Byte reserviert
$swstack = 100 'im Speicher werden für den Software-Stack 100 Byte reserviert
$framesize = 100 'im Speicher werden für den Frame 100 Byte reserviert
$baud = 19200
S1 Alias Pind.2 'Schalter 1 an Port D2 (Taster)
Config S1 = Input ' als eingang festlegen
Pind.2 = 1 'Pullup einschalten
'Timer einstellen
'Frequenz-Teiler 1,8,64,256 or 1024
Config Timer1 = Timer , Prescale = 1024
'3686400 / 1024 = 3600 impulse/sek
'Variable festlegen
Dim Sekunde As Byte , Minute As Byte
Sekunde = 0
Minute = 0
'Unterprogramme Declarieren
Declare Sub Prog1 'Unterprog. 1
Declare Sub Prog2 'Unterprog. 2
Do
If S1 = 0 Then 'Wenn S1 gedrückt
Call Prog1 'und Unterprog. 1 Starten
End If
If Timer1 >= 3600 Then
Incr Sekunde 'Sekunden werden gezählt bis 60
Print "Sekunden: " ; Sekunde
Timer1 = 0
End If
If Sekunde >= 60 Then
Incr Minute
Print "Minuten: " ; Minute 'Minuten Zähler, Sekunden auf 0 setzen
Sekunde = 0
End If
If Minute >= 60 Then 'Bei 60 Minuten, Unterprog 2 starten und Minuten auf = setzen
Minute = 0
Call Prog2
End If
Loop
End
Sub Prog1 'Unterprog. 1
Bitwait S1 , Set 'warten bis Taster S1 losgelassen wird
Print
Print "Taster S1 wurde gedrueckt"
Print
Sekunde = 0 'Zeit auf 0 setzen
Minute = 0
End Sub
Sub Prog2 'Unterprog. 2
Print
Print "Prog2 gestartet"
Print
Sekunde = 0 'Zeit auf 0 setzen
Minute = 0
End Sub
Timer 1 läuft und zählt sekunden hoch, diese zählen minuten hoch bis Taster 1 gedrückt wird oder 60 Minuten gezählt sind.
Bei Taster startet Prog1 und Zeit wird wieder auf 0 gestellt
Bei 60 min startet Prog2 und Zeit wird wieder auf 0 gestellt
ACHTUNG: Quarz richtig einstellen!!! und Timer anpassen falls andere Quarz verwendet wird
hardware.bas
05.03.2011, 15:05
Sehr gut: Quarzstabilisiert mit Baudratenquarz.
Mit dieser Hardware dürfte nix schiefgehen. VG Micha
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.