Wo kriegt Z2 seinen Wert her?
In der ISR wird Z immer mit dem Wert von Z2 überschrieben. D.h. es wird immer der gleiche Case durchlaufen; Z2 wird wahrscheinlich 0 sein, d.h. Z ist immer 1.
Hallo zusammen,
und zwar habe ich in meinem Programm ein paar Fehler:
- der Servo bekommt keine Wert. Vermute es liegt daran, dass ich mit
Variablen arbeite, weil wenn ich direkt die Werte an den Servo gebe, also
ohne Variablen, dann geht es.Könnte es sein, dass ich einen andere
Datentyp anstelle von "WORD" nehmen muss? Wenn ja welcher???
- das zweite Problem ist, dass die Cases auch nicht funktioneren. Hatte es
mir so vorgestellt, dass ich die Variable Z immer um 1 erhöhe, und so von
Case zu Case gehe. Wenn Z = 3 ist soll sie wieder auf 0 gesetzt werden.
Und das ganze beginnt von vorn.
Entweder es liegt hier auch wieder am Datentyp oder es geht nicht so,
dass ich "Select Case Z " nicht schreiben kann oder darf, wenn danach
immer "Case 1", "Case 2" oder "Case 3" aufgerufen werden soll.
Wäre super gut, wenn ihr mir weiter helfen könntet!!!
Wenn ihr eine Alternative habt, ist sie herzlich willkommen, nur würde ich
gern "Waitms" vermeiden.
Grüße High Light
Hier noch der Code:
Code:$regfile = "m48def.dat" $crystal = 16000000 $baud = 9600 'Servoeinstellungen Config Servos = 1 , Servo1 = Portd.6 , Reload = 10 Servo(1) = 90 Config Portd.6 = Output Enable Interrupts Dim Servostellung1 As Word Servostellung1 = 90 Dim Servostellung2 As Word Servostellung1 = 110 Dim Servostellung3 As Word Servostellung1 = 130 Dim Xpos1 As Byte 'StatusLED Config Portd.7 = Output Statusled Alias Portd.7 'Datenausgabe Config Portd.1 = Output Config Portd.2 = Output Config Portd.3 = Output Config Portd.4 = Output 'Analogeinstellungen Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Dim Messergebnis As Word Dim Volt As Single Messergebnis = Getadc(0) Volt = Messergebnis * Adc_multi 'Arraykonfiguration Dim Volt_list(3) As Single 'Schrittvariablen Dim T As Word Dim Z As Word Dim Z2 As Word Z = 0 T = 0 'Timer Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1 Enable Timer1 'schalte den Timer1 ein On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1 Timer1 = 3035 'Timer1 soll schon von 3035 wegzählen Do Statusled = 1 If T = 1 Then Select Case Z 'Servostellung 1 Case 1: Servo(1) = Servostellung 1 T = 0 'Servostellung 2 Case 2: Servo(1) = Servostellung 2 T = 0 'Servostellung 3 Case 3: Servo(1) = Servostellung 3 T = 0 End Select End If Loop End Isr_von_timer1: 'ISR von Timer1 Timer1 = 3035 If Z >= 3 Then Z = 0 End If Z = Z2 Z = Z2 + 1 T = 1 Return
Wo kriegt Z2 seinen Wert her?
In der ISR wird Z immer mit dem Wert von Z2 überschrieben. D.h. es wird immer der gleiche Case durchlaufen; Z2 wird wahrscheinlich 0 sein, d.h. Z ist immer 1.
#ifndef MfG
#define MfG
Ach so :-D ich seh den Fehler ich hatte geschrieben:
Z = Z2
Z = Z2 + 1
und eigentlich müsste es ja so heißen:
Z2 = Z
Z = Z2 + 1
Probier ich gleich mal aus, dankeschön!!!
Was meinst du wegen den Variablen für den Servowert?
Grüße High Light
Bascom arbeitet bei Servos mit Bytes,
http://www.rn-wissen.de/index.php/Ba...ide-Code#SERVO
d.h. du solltest für die Servovariablen auch nur bytes verwenden
Dann kannst du die Sache einfacher machen:
Im Prinzip wird das Servo immer durch den Timer auf drei verschiedene werte gestellt ( Z ), die aber festgelegt sind.
da kannst du Z gleich als Index für eine Tabelle verwenden und dir das Select ersparen (allerdings geht Z dann nichtmehr 1-3 sondern von 0-2)
Also, reduziert auf das Servo-handling:
Code:$regfile = "m48def.dat" $crystal = 16000000 $baud = 9600 'Servoeinstellungen Config Servos = 1 , Servo1 = Portd.6 , Reload = 10 Servo(1) = 90 Config Portd.6 = Output Enable Interrupts 'Schrittvariablen Dim Z As BYTE 'Timer Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1 Enable Timer1 'schalte den Timer1 ein On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1 Timer1 = 3035 'Timer1 soll schon von 3035 wegzählen Do Statusled = 1 Loop End Isr_von_timer1: 'ISR von Timer1 Timer1 = 3035 Servo(1) = lookup ( Z, Servo_tabelle) INCR Z ' Z + 1 If Z > 2 Then Z = 0 End If Return Servo_tabelle: DATA 90, 110, 130 ' servo-stellungen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Klasse, bin gerad oberglücklich!!!
Mein Programm läuft, hab es abgeändert und dabei noch 2 bis 3 andere
kleine Fehler gefunden.
Vielen Dank!!!
Morgen probier ich das ganze nach deiner Möglichkeit noch aus, mit der Tabelle.
Als nächstes kommt jetzt dann noch eine Anlogwertauswertung dazu,
welche in ein Array schreiben soll, ob ein bestimmter Wert überschritten
worden ist, oder nicht.
Danke nochmal an euch, und bis bald
Grüße High Light
Hallo zusammen,
jetzt ist es soweit, dass nächste Problem,
also der Servo fahrt nun seine Positionen an.
Immer wenn er eine Position angefahren hat, soll
ein Analogwert eingelesen, ausgewertet und dann
in ein Array geschrieben werden.
Wenn das Array mit einem bestimmten Wert beschrieben ist,
soll ein Signalausgang geschalten werden.
Nur funktioniert nichts, der Portd.0 und Portd.1 reagieren gar nicht,Code:$regfile = "m48def.dat" $crystal = 16000000 $baud = 9600 'Servoeinstellungen Config Servos = 1 , Servo1 = Portd.6 , Reload = 10 Servo(1) = 90 Config Portd.6 = Output Enable Interrupts Dim Servostellung1 As Byte Servostellung1 = 90 Dim Servostellung2 As Byte Servostellung2 = 110 Dim Servostellung3 As Byte Servostellung3 = 130 Dim Xpos1 As Byte 'StatusLED Config Portd.7 = Output Statusled Alias Portd.7 'Signalausgabe Signal1 Alias Portd.0 Config Signal1 = Output Signal2 Alias Portd.1 Config Signal2 = Output Signal3 Alias Portd.2 Config Signal3 = Output Signal4 Alias Portd.3 Config Signal4 = Output Signal1 = 1 Signal2 = 1 Signal3 = 1 Signal4 = 1 'Analogeinstellungen Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Dim Messergebnis As Word Dim Volt As Single Messergebnis = Getadc(0) Volt = Messergebnis * Adc_multi 'Arraykonfiguration Dim Volt_list(3) As Single 'Schrittvariablen Dim T As Byte Dim Z As Byte Dim Z2 As Byte Z = 0 T = 0 'Timer Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1 Enable Timer1 'schalte den Timer1 ein On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1 Timer1 = 3035 'Timer1 soll schon von 3035 wegzählen Do 'Statusled Statusled = 1 'Wenn Arrayinhalt = 10 dann SignalX = 0 If Volt_list(1) = 10 Then Signal3 = 0 Elseif Volt_list(1) = 100 Then Signal3 = 1 End If If Volt_list(2) = 10 Then Signal2 = 0 Elseif Volt_list(2) = 100 Then Signal2 = 1 End If If Volt_list(3) = 10 Then Signal2 = 0 Elseif Volt_list(3) = 100 Then Signal2 = 1 End If 'Servo stellen und Analogwert auslesen und Arry schreiben If T = 1 Then Select Case Z 'Servostellung 1 Case 2: Servo(1) = Servostellung1 T = 0 If Volt <= 3.0 Then Volt_list(1) = 100 Elseif Volt > 3.0 Then Volt_list(1) = 10 End If 'Servostellung 2 Case 4: Servo(1) = Servostellung2 T = 0 If Volt <= 3.0 Then Volt_list(2) = 100 Elseif Volt > 3.0 Then Volt_list(2) = 10 End If 'Servostellung 3 Case 6: Servo(1) = Servostellung3 T = 0 If Volt <= 3.0 Then Volt_list(3) = 100 Elseif Volt > 3.0 Then Volt_list(3) = 10 End If End Select End If Loop End Isr_von_timer1: 'ISR von Timer1 Timer1 = 3035 If Z >= 6 Then Z = 0 End If Z2 = Z Z = Z2 + 1 T = 1 Return
auch wenn sie dierekt geschalten werden. Portd.2 und Portd.3 kann
man direkt schalten, aber mit dem Programm funktioniert es nicht???
Also muss zum einen ein oder mehrere Fehler im Programm sein
und zum anderen versteh ich nicht, warum die ersten 2 Ausgänge nicht
reagieren???
Hat jemand eine Idee???
Grüße High Light
Bascom hat eine Eigenheit:
Beim In/out-configurieren ist er schizophren:
Ein ganzes Port wird definier:
CONFIG PORTD = Output
aber einzelne Pin als
CONFIG PIND.0 = Output
CONFIG PIND.1 = Output
CONFIG PIND.2 = Output
CONFIG PIND.3 = Output
d.h. dein Alias kannst du zwar im programm verwenden, aber nicht zum "Output" setzen.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ah okey, dass wusste ich nicht, bis jetzt hatte ich damit noch keine
Probleme gehabt. Hab es aber geändert, jedoch ist alles noch wie zuvor.
Als nächstes werde ich mal den Controller tauschen, vlt ist dieser kaputt,
weil die 2 ersten Pins gehen immer noch nicht.
Aber igrendwie stimmt da was mit dem Array nicht, weil an den 2
funktionsfähigen Ausgängen ändert sich nichts, wenn sich das Analogsignal
ändert.
Den wenn sich dieses ändert, müsste sich ja auch der Inhalt des Arrays
ändern?!?
Aber wo liegt der Fehler???
SINGLES ( volt_list ) mit "=" abzufragen, klappt oft nicht.
Du schreibst doch ohnehin keine dezimalen rein, nur 100 oder 10
Nimm doch lieber Byte
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo High Light,
solange du die $baud-Direktive im Programm hast, werden die Pins PIND.0 und PinD.1 als RXD und TXD für den USART verwendet. Nimm die einfach mal raus.
In dem Teil
If Volt_list(3) = 10 Then
Signal2 = 0
Elseif Volt_list(3) = 100 Then
Signal2 = 1
End If
setzt du genau so wie in dem Teil davor den Ausgang Signal2. Ist das gewollt?
Lesezeichen