PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM simple Uhr



runner02
03.08.2011, 14:25
Hallo,


https://www.roboternetz.de/community/showthread.php?54233-Dezimalzahl-in-Bin%E4rzahl-umwandeln-Atmega8&p=519908#post519908

Das würde ich gerne anwenden, in Form einer binären Uhr...



Code ist folgender,



$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 130
$swstack = 130

Config Portd = Output
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Dim minutes as Byte
Dim hours as Byte
Dim day as Integer
Dim tausender as Byte
Dim hunderter as Byte
Dim zehner as Byte
Dim einer as Byte
Dim i as Byte

DDRD=&B11111111
DDRC=&B11111111
DDRB=&B11111000


On Timer1 Isr_von_timer1

Enable Interrupts
Timer1 = 6942


Do ' Hauptprogramm

if hours=23 and minutes=50 ' Fehler: 'three parameters expected' in file C/.../Uhr.bas?

then ' Then als Fehler erkannt - unknown statement?

day=day+1
hours=0
end if

If Pinb.0 = 1 Then
minutes=minutes+1
End If

If Pinb.1 = 1 Then ' Taster, um die Uhr einzustellen
hours=hours+1
End If

If Pind.b = 1 Then
day=day+1
End If

If Pinb.3 = 1 Then
day=day+100
End If

If Pinb.4 = 1 Then ' gib die Anzahl der laufenden Tage an


tausender=day/1000
hunderter=(day-1000*tausender)/100

zehner=(day-1000*tausender-100*hunderter)/10

einer=(day-1000*tausender-100*hunderter-10*zehner)



for i=0 to i=tausender step 1 'jedes mal blinken gibt einen Tausender -> 5* blinken = 5000

Pinb.5=1
waitms 100

Pinb.5=0
waitms 100

Next

for i=0 to i=hunderter step 1

Pinb.6=1
waitms 100

Pinb.6=0
waitms 100

Next


for i=0 to i=zehner step 1

Pinb.7=1
waitms 100

Pinb.7=0
waitms 100

Next


for i=0 to i=einer step 1

Pind.7=1
waitms 100

Pind.7=0
waitms 100

Next




End If

PORTD=Bin(minutes)
PORTC=Bin(hours)

Loop
End



Isr_von_timer1:

Timer1 = 6942

minutes=minutes+1
if minutes=60
then minutes = 0
hours=hours+1
end if

PORTD=Bin(minutes)
PORTC=Bin(hours)


Return


'Line 0 Loop expected, in file: <- leer, keine Pfadangabe


Aber es werden leider 3 Fehler angezeigt beim Compilieren, die ich nicht beheben kann :(

DanielSan
03.08.2011, 14:49
Welche Fehler sind das?
Poste die mal dann kann man dir sicher helfen. Ich hab hier grad kein Bascom.

Gruß Daniel

runner02
04.08.2011, 18:02
Habe ich dort, wo sie aufgetreten sind, im Kommentar dazugeschrieben...

Sie lauten:


'Line 0 Loop expected, in file: <- leer, keine Pfadangabe


Then als Fehler erkannt - unknown statement?

' Fehler: 'three parameters expected' in file C/.../Uhr.bas?

peterfido
04.08.2011, 18:23
if hours=23 and minutes=50 then ' in eine Zeile

Evtl verschwindet dann schon der letzte Fehler. Er findet den loop zu dem do nicht...

runner02
04.08.2011, 18:32
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 130
$swstack = 130

Config Portd = Output
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Dim minutes as Byte
Dim hours as Byte
Dim day as Integer
Dim tausender as Byte
Dim hunderter as Byte
Dim zehner as Byte
Dim einer as Byte
Dim i as Byte

DDRD=&B11111111
DDRC=&B11111111
DDRB=&B11111000


On Timer1 Isr_von_timer1

Enable Interrupts
Timer1 = 6942


Do ' Hauptprogramm

if hours=23 and minutes=50 then ' Fehler: 'three parameters expected' in file C/.../Uhr.bas?

day=day+1
hours=0
end if

If Pinb.0 = 1 Then
minutes=minutes+1
End If

If Pinb.1 = 1 Then ' Taster, um die Uhr einzustellen
hours=hours+1
End If

If Pind.b = 1 Then
day=day+1
End If

If Pinb.3 = 1 Then
day=day+100
End If

If Pinb.4 = 1 Then ' gib die Anzahl der laufenden Tage an


tausender=day/1000
hunderter=(day-1000*tausender)/100

zehner=(day-1000*tausender-100*hunderter)/10

einer=(day-1000*tausender-100*hunderter-10*zehner)



for i=0 to i=tausender step 1 'jedes mal blinken gibt einen Tausender -> 5* blinken = 5000

Pinb.5=1
waitms 100

Pinb.5=0
waitms 100

Next

for i=0 to i=hunderter step 1

Pinb.6=1
waitms 100

Pinb.6=0
waitms 100

Next


for i=0 to i=zehner step 1

Pinb.7=1
waitms 100

Pinb.7=0
waitms 100

Next


for i=0 to i=einer step 1

Pind.7=1
waitms 100

Pind.7=0
waitms 100

Next




End If

PORTD=Bin(minutes)
PORTC=Bin(hours)

Loop
End



Isr_von_timer1:

Timer1 = 6942

minutes=minutes+1
if minutes=60
then minutes = 0
hours=hours+1
end if

PORTD=Bin(minutes)
PORTC=Bin(hours)


Return


'Line 0 Loop expected, in file: <- leer, keine Pfadangabe[/QUOTE]






Hm, wie kann ich die loop noch verändern??? klein schreiben wird das selbe sein, oder??

EDIT: Du meinst, wenn then oben steht geht es? Ich probiers mal und post es dann

Kampi
04.08.2011, 18:37
So hier ist der korrigierte Code. Bascom gibt keine Fehler mehr aus:


$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 130
$swstack = 130

Config Portd = Output
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Dim minutes as Byte
Dim hours as Byte
Dim day as Integer
Dim tausender as Byte
Dim hunderter as Byte
Dim zehner as Byte
Dim einer as Byte
Dim i as Byte

DDRD=&B11111111
DDRC=&B11111111
DDRB=&B11111000


On Timer1 Isr_von_timer1

Enable Interrupts
Timer1 = 6942


Do ' Hauptprogramm

If Hours = 23 And Minutes = 50 Then 'korrigiert Then hinter Minutes = 50

day=day+1
hours=0
end if

If Pinb.0 = 1 Then
minutes=minutes+1
End If

If Pinb.1 = 1 Then ' Taster, um die Uhr einzustellen
hours=hours+1
End If

If Pind.2 = 1 Then 'korrigiert PIND.2 nicht PIND.b
day=day+1
End If

If Pinb.3 = 1 Then
day=day+100
End If

If Pinb.4 = 1 Then ' gib die Anzahl der laufenden Tage an


'tausender=day/1000
'hunderter=(day-1000*tausender)/100
'zehner=(day-1000*tausender-100*hunderter)/10
'einer=(day-1000*tausender-100*hunderter-10*zehner)



For I = 0 To Tausender Step 1 'korrigiert I = Tausender weg

Pinb.5=1
waitms 100

Pinb.5=0
waitms 100

Next I 'korrigiert Next I

For I = 0 To Hunderter Step 1 'korrigiert I = hunderter weg

Pinb.6=1
waitms 100

Pinb.6=0
waitms 100

Next


For I = 0 To Zehner Step 1 'korrigiert I = zehner weg

Pinb.7=1
waitms 100

Pinb.7=0
waitms 100

Next


For I = 0 To Einer Step 1 'korrigiert I = einer weg

Pind.7=1
waitms 100

Pind.7=0
waitms 100

Next

End If

PORTD=Bin(minutes)
PORTC=Bin(hours)

Loop
End



Isr_von_timer1:

Timer1 = 6942

minutes=minutes+1
If Minutes = 60 Then
Minutes = 0 'korrigiert Then hinter Minutes = 60
hours=hours+1
end if

PORTD=Bin(minutes)
PORTC=Bin(hours)


Return

runner02
04.08.2011, 19:28
Toll, danke ;)

werd mich dann gleich daran machen, die Schaltung aufzubauen :)

runner02
07.08.2011, 13:15
Auf der Steckplatine klappt es leider noch nicht...



If Pind.2 = 1 Then 'korrigiert PIND.2 nicht PIND.b


sollte b2 sein.


Aber nach 1 Minute leuchtet d1 noch nicht. Dafür leuchtet d4 nach 2 sek und hört nicht mehr auf... :(

Ich seh schon, da kommt noch was auf mich zu ;)

runner02
07.08.2011, 16:21
Ich habe den Code nochmal vereinfacht bzw. habe ich mein erstes Exempel herausgepickt und will es schrittweise auf die Uhr erweitern - bis alles klappt.





'############################ Definitionen #######

$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 130
$swstack = 130

Config Portd = Output
Config Portc = Output
Config Timer1 = Timer , Prescale = 64
Enable Timer1
Dim Sekunden As Byte

On Timer1 Isr_von_timer1

Enable Interrupts
Timer1 = 49910


'##################### Hauptprogramm ############


Do
Portc.4 = 1
Waitms 200
Portc.4 = 0
Waitms 200
Loop
End


'############################ ISR ################

Isr_von_timer1:

Timer1 = 49910

Portc.1 = 1
Waitms 40
Portc.1 = 0
Waitms 40

Sekunden = Sekunden + 1

If Sekunden = 60 Then
Sekunden = 0
End If

Portd = Bin(sekunden)

Return




Portc.4 blinkt immer. Wie gedacht
Portc.1 blinkt nur einmal, dann nicht mehr -> Timer Interrupt wird nur einmal ausgeführt!!

Jemand zufällig ne Idee, woran dass liegen könnte?