PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bin am verzeifeln mit einem Sekundenzähler und PWM



Geppi41
01.03.2007, 15:35
Hallo allerseits,

habe folgendes Problem:
Hardware: rn-control board

Das Programm soll ein Abwärtszähler in Sekunden mit einem PWM Ausgang für einen Servomotor werden. Die Zeit und Geschwindigkeit werden über 2 Encoder eingestellt. Über eine beleuchtete Taste wird der Abwärtszähler eingeschaltet. Der Motor läuft nun mit der eingestellten Geschwindigkeit bis die Zeit abgelaufen ist. Außerdem gibt es noch ein LCD zur Anzeige. Das Programm funktioniert eigendlich. Wenn ich aber versuche einen PWM Ausgang zu programmieren geht gar nichts mehr. Ich habe das versucht über die config servo funktion und über Timer0 = PWM. Hat alles nicht geklappt.

Es wäre schön wenn einer mal den Code ansieht und mir ein paar Tips gibt, wie man so was richtig programmiert




$regfile = "m32def.dat" 'specify the used micro
$crystal = 4000000 ' used crystal frequency
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 64 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame spaceconfig

Config Clock = Soft ' Konfiguriere softclock für LCD Anzeige in mm:ss
Config Debounce = 30 'Konfiguriere Debouncezeit = 30ms

Config Timer1 = Timer , Prescale = 1024 'Konfiguriere Timer1 Für Sekundentakt '
Enable Timer1 ' Timer1 einschalten
On Timer1 Sekundentakt 'Verzweige bei Timer1 überlauf zu Isr_von_Timer1
Timer1 = 49900

Enable Interrupts

Config Portb.3 = Input 'Start/Abbruch Taster
Config Portb.4 = Output 'LED blinkt während Betrieb

Config Porta.0 = Input
Config Porta.1 = Input
Config Porta.2 = Input
Config Porta.3 = Input
Config Porta.4 = Input
Config Porta.5 = Input


Portb.3 = 1
Portb.4 = 0
Porta = &B11111111
'Portd = &B11111111

Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 20 * 4
Cursor Off

Dim B As Byte
Dim A As Byte
Dim Speed As Integer
Dim Overtorque As Word
Dim Flag_overtorque As Bit
Dim Sekunde As Long
Dim Act_sekunde As Long
Dim Str_time As String * 10
Dim Str_speed As String * 10
Dim Taster_count As Byte
Dim Skip_flag As Byte
Dim Mem_sekunde As Eram Long
Dim Mem_speed As Eram Integer

Taster_start_stop Alias Pinb.3

Speed = Mem_speed
Sekunde = Mem_sekunde
Taster_count = 0
Skip_flag = 1

Cls
Home
Lcd "** CALOGRINDER V5 **"
Locate 3 , 5 : Lcd "PVT-BENSHEIM"
Wait 2
Lowerline
Cls
Home
Lcd "SPEED (%)"
Str_speed = Str(speed)
Locate 1 , 18 : Lcd Format(str_speed , "000")
Lowerline
Lcd "TIME (min)"
Str_time = Time(sekunde)
Locate 2 , 16 : Lcd Right(str_time , 5)
Thirdline
Lcd "____________________"
Fourthline
Lcd "REMAINING TIME"
Locate 4 , 16
Lcd "00:00"

'-----------------------------------------------------------------------------------
Mainprogram:
'-----------------------------------------------------------------------------------
Do
B = Encoder(pina.1 , Pina.0 , Runtime_up , Runtime_down , 0)
A = Encoder(pina.4 , Pina.3 , Speed_up , Speed_down , 0)
Debounce Pinb.3 , 0 , Tasterevent , Sub
Debounce Pina.5 , 0 , Speedplus , Sub
Debounce Pina.2 , 0 , Timeplus , Sub
Loop

'-----------------------------------------------------------------------------------
Speed_up:
'-----------------------------------------------------------------------------------
If Skip_flag = 1 Then
Skip_flag = 0
Return
End If
Incr Speed
Skip_flag = 1
If Speed >= 100 Then
Speed = 100
End If
Str_speed = Str(speed)
Locate 1 , 18
Lcd Format(str_speed , "000")
Return

'-------------------------------------------------------------------------------------
Speed_down:
'-------------------------------------------------------------------------------------
If Skip_flag = 1 Then
Skip_flag = 0
Return
End If
Decr Speed
Skip_flag = 1
If Speed < 1 Then
Speed = 0
End If
Str_speed = Str(speed)
Locate 1 , 18
Lcd Format(str_speed , "000")
Return

'-------------------------------------------------------------------------------------
Runtime_up:
'-------------------------------------------------------------------------------------
If Skip_flag = 1 Then
Skip_flag = 0
Return
End If
If Sekunde <= 3598 Then
Incr Sekunde '
Skip_flag = 1
Str_time = Time(sekunde)
Locate 2 , 16 : Lcd Right(str_time , 5)
End If
Return
'------------------------------------------------------------------------------------
Runtime_down:
'------------------------------------------------------------------------------------
If Skip_flag = 1 Then
Skip_flag = 0
Return
End If
If Sekunde > 0 Then
Decr Sekunde '
Skip_flag = 1
Str_time = Time(sekunde)
Locate 2 , 16 : Lcd Right(str_time , 5)
End If
Return
'
'-----------------------------------------------------------------------------
Sekundentakt:
'-----------------------------------------------------------------------------
Timer1 = 49900
If Taster_count = 1 Then
Decr Act_sekunde
Str_time = Time(act_sekunde)
Locate 4 , 16 : Lcd Right(str_time , 5)
Gosub Run
End If
Return

'-----------------------------------------------------------------------------
Run:
'-----------------------------------------------------------------------------
'
Toggle Portb.4
Waitms 500
Toggle Portb.4

If Act_sekunde <= 0 And Taster_count = 1 Then
Taster_count = 0
Reset Portb.4
Cls
Lowerline
Locate 2 , 3 : Lcd "**GRINDING END**"
Sound Portd.7 , 400 , 450
Waitms 333
Sound Portd.7 , 400 , 450
Waitms 333
Sound Portd.7 , 400 , 450
Waitms 333
Goto Startanzeige
End If
Return

'-----------------------------------------------------------------------------
Tasterevent:
'-----------------------------------------------------------------------------
Taster_count = Taster_count + 1
Act_sekunde = Sekunde
If Taster_count = 1 And Sekunde = 0 Or Speed = 0 Then
Taster_count = 0
End If

If Sekunde <> Mem_sekunde Then
Mem_sekunde = Sekunde
End If
If Speed <> Mem_speed Then
Mem_speed = Speed
End If

If Taster_count = 2 Then
Taster_count = 0
Reset Portb.4
Cls
Lowerline
Locate 2 , 3 : Lcd "<<<<BREAKOFF>>>>"
Sound Portd.7 , 50 , 80000
Goto Startanzeige
End If

Return

'-----------------------------------------------------------------------------
Speedplus:
'-----------------------------------------------------------------------------
If Speed < 91 Then
Speed = Speed + 10
Str_speed = Str(speed)
Locate 1 , 18
Lcd Format(str_speed , "000")
Waitms 100
Elseif Speed = 100 Then
Speed = 0
End If
Return

'-----------------------------------------------------------------------------
Timeplus:
' -----------------------------------------------------------------------------
Sekunde = Sekunde + 60
Str_time = Time(sekunde)
Locate 2 , 16 : Lcd Right(str_time , 5)
Waitms 100
Return

'-----------------------------------------------------------------------------
Startanzeige:
'-----------------------------------------------------------------------------
Cls
Home
Lcd "SPEED (%)"
Str_speed = Str(speed)
Locate 1 , 18 : Lcd Format(str_speed , "000")
Lowerline
Lcd "TIME (min)"
Str_time = Time(sekunde)
Locate 2 , 16 : Lcd Right(str_time , 5)
Thirdline
Lcd "____________________"
Fourthline
Lcd "REMAINING TIME"
Locate 4 , 16
Lcd "00:00"
Return

jar_
10.03.2007, 11:23
habe ein ähnliches Problem,

LCD Ausgabe funktioniert, aber nur solange bis ich den Timer für PWM vorbereite !

ich tippe auf LCD nutzt Timerroutinen

blicke noch nicht durch, bin erst seit 3 Tagen mit AVR zugange, hab vorher 6502,z80,LH5801 bas c und asm programmiert

Atmels sind völlig neu für mich

Dirk
10.03.2007, 12:08
Es liegt daran, dass Timer0 bei dir schon durch CONFIG CLOCK = SOFT belegt ist.
Wenn du zusätzlich CONFIG SERVOS benutzt, wird der Timer0 doppelt belegt, das gilt auch für Timer0 = PWM.

Gruß Dirk

Hanni
10.03.2007, 12:48
bin erst seit 3 Tagen mit AVR zugange, hab vorher 6502,z80,LH5801 bas c und asm programmiert

Naja, was hindert dich daran den µC in C zu programmieren?
Unter Bascom gibt es nämlich immer mal wieder solche Nebeneffekte.

Grüße,
Hanni

jar_
11.03.2007, 09:46
Unter Bascom gibt es nämlich immer mal wieder solche Nebeneffekte.
Grüße,
Hanni

ja danke, werde ich uberlegen, bin ja grad erst neu dabei

Dirk
11.03.2007, 10:35
Hallo Hanni,


Unter Bascom gibt es nämlich immer mal wieder solche Nebeneffekte.

Als Bascom-Fan muss ich natürlich sagen, dass man sicher auch in C keinen Timer doppelt belegen kann. Oder?

Gruß Dirk

Hanni
11.03.2007, 10:43
Hallo Hanni,

[quote]Als Bascom-Fan muss ich natürlich sagen, dass man sicher auch in C keinen Timer doppelt belegen kann. Oder?

Ja und nein.
Das Problem bei Bascom ist, das Timer zum Teil exklusiv für diverse Funktionen benutzt werden.

der Vorteil von C / ASM ist, das man es sich selbst aussuchen kann was man wofür und wie benutzt ....

Dirk
11.03.2007, 14:10
der Vorteil von C / ASM ist, das man es sich selbst aussuchen kann was man wofür und wie benutzt ....

Ja, das ist klar. Und deshalb geht manchmal natürlich nichts ohne ASM.

Zumindest schweigt die Bascom-Doku sich nicht darüber aus, welcher Timer für welche Funktion verwendet wird. Insofern kann man auch damit planen. Bei manchen Befehlen läßt sich auch die Timer-Nutzung ändern.

Gruß Dirk

jar
12.03.2007, 14:27
ich bin nun jar ohne _