-
Jap so etwas hatte ich mir inziwschen fast gedacht, dass die Pins
nicht funktionieren wegen einem Fehler im Programm.
Hatte das ganze Ding schon zerlegt, Controller getauscht,
Verbindungskabel überprüft, Fehler auf Leiterplatte gesucht...
Danke, für den Tipp O:)
Das mit dem Signal2 ist ein Fehler durchs Kopieren, wurde auch geändert.
Singel wurde auch auf Byte geändert!
Und siehe da es geht schon mehr:
- Alle 4 Signale funktionieren (auch wenn ich nur 3 brauche)
- Jetzt ist es so, dass mit den ersten 3 Bewegungen, jeweils ein weiteres
Signal kommt. Nach der dritten Servobewegung ändert sich an den Signalen
nichts mehr. Alle 3 Signal sind dann da.
- Die Signale kommen egal was für ein Analogwert vorhanden ist.
Bin mir nur nicht sicher wo der Fehler liegt, so wie ich es gerad sehe,
schreibt er immer die 10 in die Arrays, egal was für ein Analogwert
ansteht.
Seh aber auch keinen Fehler im Programm, bei den Vergleichen oder beim Array beschreiben?!?
Irgendwie sollt ich sehen was in die Arrays geschrieben wird, wenn ein bestimmter Analogwert ansteht.
Ich weiß nicht mehr weiter...
Grüße High Light
P.s.: Hier noch das neue Programm:
Code:
$regfile = "m48def.dat"
$crystal = 16000000
'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 Pind.7 = Output
Statusled Alias Pind.7
'Signalausgabe
Config Pind.0 = Output
Signal1 Alias Pind.0
Config Pind.1 = Output
Signal2 Alias Pind.1
Config Pind.2 = Output
Signal3 Alias Pind.2
Config Pind.3 = Output
Signal4 Alias Pind.3
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 Byte
'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
Signal1 = 0
Elseif Volt_list(3) = 100 Then
Signal1 = 1
End If
'Servo stellen und Analogwert auslesen und Array schreiben
If T = 1 Then
Select Case Z
'Servostellung 1
Case 2:
Servo(1) = Servostellung1
T = 0
If Volt <= 4.2 Then
Volt_list(1) = 100
Elseif Volt > 4.2 Then
Volt_list(1) = 10
End If
'Servostellung 2
Case 4:
Servo(1) = Servostellung2
T = 0
If Volt <= 4.2 Then
Volt_list(2) = 100
Elseif Volt > 4.2 Then
Volt_list(2) = 10
End If
'Servostellung 3
Case 6:
Servo(1) = Servostellung3
T = 0
If Volt <= 4.2 Then
Volt_list(3) = 100
Elseif Volt > 4.2 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
-
Hallo zusammen,
Also am Programm liegt es meiner Vermutung nach nicht,
hab ein altes Programm umgeschrieben, mit dem ich schon mal einen
Analogwert eingelesen hab.
Und meine Feststellung ist, dass im Prgramm immer der höchste Wert steht.
Bedeutet dass er nicht mitbekommt, dass sich der Analogwert ändert.
Nach folgendem Beispiel hab ich es angeschlossen, nur habe ich vor dem
Messpunkt noch einen 12KOhm Widerstand drin, wenn ich den aber
brücke ändert sich auch nichts.
http://halvar.at/elektronik/kleiner_...dc_mit_getadc/
Jemand eine Vermutung oder Idee???
Gruß High Light
-
Hallo!
Du machst nur eine einzige ADC-Messung.
MfG
-
Ja klar, ich will ja nur an einem Punkt den Analogwert erfassen,
oder meinst du, dass ich ihn im Programm nur einmal erfasse?
Wenn ja wo und wie änder ich das?
Grüße High Light
Schöne Weihnachten euch allen und viele Geschenke!!!
-
Du hast den Befehl Messergebnis = Getadc(0) vor die Do-Loop-Schleife geschrieben, und deshalb wird er auch nur ein einziges mal ausgeführt! Auch wenn sich das Analogsignal ständig ändert, bleibt die Variable Messwert zunächst einmal unverändert - bis der Befehl Messwert = Getadc(0) das nächste mal ausgeführt wird. Von daher muss diese Zeile unbedingt in die Hauptschleife, wenn Du eine kontinuierliche Auswertung des Analogsignales haben möchtest!
-
Achso, macht Sinn! dankeschön!!!
Probier ich gleich aus!
Wie ist es mit der Auslastung für den Controller???
Bringt es viel Rechenaufwand mit sich, wenn er dies kontinuierlich macht? Wenn ja sollte man es dann immer aus- und einschalten?
-
Hallo High Light,
das reine Umwandeln von Analog- in Digitalsignale kostet den Controller keine Rechenleistung, weil es auf Hardware-Ebene geschieht - sozusagen im "Hintergrund". Wenn Du den AD-Converter kontinuierlich laufen lässt, bremst das das Programm definitiv nicht aus. Der Converter braucht halt ein wenig Strom, allerdings auch nicht so viel, dass davon gleich die Glühbirnen dunkler werden :-) Aber wenn es mal auf konsequente Reduktion der Stromaufnahme ankommt, kann es durchaus sinnvoll sein den ADC nur bei Bedarf zu aktivieren - in allen anderen Fällen kann man ihn guten Gewissens durchlaufen lassen.
Der Befehl Getadc(x), mit dem der letzte gemessene Wert des Converters ausgelesen wird, braucht laut Simulator 28 Taktzyklen. Bei 16 MHz also knapp 2 µS - das sollte keine kritische Verzögerung sein...
-
Alles klar, dankeschön für die klasse Unterstützung!!!
Als nächstes werd ich mich jetzt um das Thema I2C kümmern,
hatte schon einmal damit angefangen, aber nachdem ich es nicht
hinbekommen hatte, hatte ich es aufgegeben.
Schaun wir mal, wie weit ich dieses mal komme!!!
Auf jeden Fall muss es klappen.
Möchte, dass ich Werte vom Master an die Slaves sende, und wenn die
Slaves einen bestimmten Wert erhalten haben, sollen sie einen Ausgang
einschalten und mit einer Art "Ok" dem Master melden, dass sie die Daten
bekommen haben.
Anschließend soll dies dann noch so erweitert werden, dass der Master mit
einer Nachricht alle Slaves Stoppen kann.
Damit werde ich dann morgen mal anfangen, mal sehen wann ich dieses
Mal aufgebe...noch bin ich motiviert :-D
Habt ihr schon Erfahrung mit I2C???
Grüße High Light
-
So hab mich wieder in das Thema eingearbeitet!!!
Hatte dazu schon einmal ein Thema eröffnet,
in dem geht es jetzt auch weiter...
Wäre klasse wenn ihr dort Mal vorbei sehen könntet,
vielleicht könntet ihr mir weiter helfen!!!
Thema: I2C zwischen Atmegas 88
Grüße High Light
-
Hallo zusammen,
Hab den Bus zum Laufen gebracht und bin richtig happy!!!
Ich habe nun nach einigen Versuchen das erste richtige Programm
für den Master und den Slave geschrieben. Das Master-Programm
scheint soweit zustimmen, aber beim Slave läuft dauernd etwas schief
und zwar funktioniert das Case 20 nicht.
Wenn der Slave den Wert 20 erhält, soll er den Ablauf in Case 20
durcharbeiten. Jedoch fährt er alle 3 Servos auf eine undefinierte Positon
und mehr nicht.
Was stimmt mit Case 20 nicht?
Habt ihr eine Idee???
Slave-Code:
Code:
$regfile = "m88def.dat"
$crystal = 16000000
'I2C Konfiguration
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
Dim Neuesbyte As Byte ' Bytemerker
Declare Sub Twi_init_slave
Twi_data = 0
Call Twi_init_slave ' TWI aktivieren
'Servokonfiguration
Config Portb = Output
Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10
Enable Interrupts
Dim Xpos1 As Byte
'StatusLED
Config Portd.0 = Output
Statusled Alias Portd.0
Statusled = 1
'Variablen
Dim Freigabe As Byte
Freigabe = 0
' Hauptschleife
Do
' Merker zurücksetzen
Neuesbyte = 0
' schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status
' wurde ein Byte geschickt
If Twi_status = &H80 Or Twi_status = &H88 Then
Twi_data = Twdr ' neue Daten merken
Neuesbyte = 1 ' merken das ein neues Byte da ist
End If
' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End If
'Start
If Twi_data = 10 Then
Statusled = 0 ' StatusLED anschalten
Freigabe = 1
End If
'Stop
If Twi_data = 100 Then
Statusled = 1 ' StatusLED ausschalten
Freigabe = 0
End If
'Ablauf start
If Freigabe = 1 Then
Select Case Twi_data
Case 20:
Servo(1) = 100
Servo(2) = 105
Servo(3) = 80
For Xpos1 = 100 To 103
Servo(1) = Xpos1
Waitms 167
Next
For Xpos1 = 103 To 106
Servo(1) = Xpos1
Waitms 167
Next
Servo(1) = 98
Servo(2) = 140
Servo(3) = 50
Waitms 250
Servo(1) = 91
Servo(2) = 105
Servo(3) = 80
Waitms 250
For Xpos1 = 91 To 94
Servo(1) = Xpos1
Waitms 167
Next
For Xpos1 = 94 To 97
Servo(1) = Xpos1
Waitms 167
Next
For Xpos1 = 97 To 100
Servo(1) = Xpos1
Waitms 167
Next
End Select
End If
Loop
End
' Unterprogramme
' TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = &HCA ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
End Sub
Grüße High Light