Hallo, Ich hoffe ihr könnt mir helfen, ich brauche eine möglichkeit über einen BCD Schalter 10 verschiedene Programme anzusteuern, bisher hab ich es so wie im Anhang gelöst, jedoch funtioniert die lösung nur einmal, dann geht nix mehr hilfe !. $regfile = "m8def.dat" 'Atmega 8 definieren $crystal = 8000000 'Taktfrequenz Config Pind.2 = Input 'PIN C 0 EINGANG Config Pind.3 = Input 'PIN C 1 EINGANG Config Pind.4 = Input 'PIN C 2 EINGANG Config Pind.5 = Input 'PIN C 3 EINGANG Config Pinb.0 = Output 'PIN B 0 AUSGANG Config Pinb.1 = Output 'PIN B 1 AUSGANG Config Pinb.2 = Output 'PIN B 2 AUSGANG Rot Alias Portb.0 'ROT PIN B 0 zuweisen Gruen Alias Portb.1 'GRUEN PIN B 1 zuweisen Blau Alias Portb.2 'BlAU PIN B 2 zuweisen 'Config Timer0 = Timer , Prescale = 64 'On Ovf0 'Bei Überlauf(Ende) springe zu Config Int0 = Rising 'Interrupt 0 bei Wechsel Enable Interrupts Enable Int0 'Int 0 aktivieren 'Enable Timer0 'Interrupts aktivieren On Int0 Bcd_auswahl: 'Bei Interrupt 0 springe zu bcd auswahl Bit1 Alias Pind.2 Bit2 Alias Pind.3 Bit4 Alias Pind.4 Bit8 Alias Pind.5 Dim Stellung As Byte Stellung = 0 Do Anfang: If Stellung = 0 Then Do Rot = 1 'Rote LED Ein Gruen = 0 'Gruene LED Aus Blau = 1 'Blaue LED Ein Loop End If 'Looping If Stellung = 1 Then Do Rot = 1 Gruen = 0 Blau = 0 Loop End If If Stellung = 2 Then Do Rot = 0 Gruen = 1 Blau = 0 Loop End If If Stellung = 3 Then Do Rot = 0 Gruen = 0 Blau = 1 Loop End If If Stellung = 4 Then Do Rot = 1 Gruen = 1 Blau = 0 Loop End If If Stellung = 5 Then Do Rot = 0 Gruen = 1 Blau = 1 Loop End If If Stellung = 6 Then Do Rot = 1 Gruen = 0 Blau = 1 Loop End If Loop Bcd_auswahl: If Bit1 = 0 And Bit2 = 0 And Bit4 = 0 And Bit8 = 0 Then jmp anfang: End If If Bit1 = 1 And Bit2 = 0 And Bit4 = 0 And Bit8 = 0 Then Stellung = 1 jmp anfang: End If If Bit1 = 0 And Bit2 = 1 And Bit4 = 0 And Bit8 = 0 Then Stellung = 2 jmp anfang: End If If Bit1 = 1 And Bit2 = 1 And Bit4 = 0 And Bit8 = 0 Then Stellung = 3 jmp anfang: End If If Bit1 = 0 And Bit2 = 0 And Bit4 = 1 And Bit8 = 0 Then Stellung = 4 jmp anfang: End If If Bit1 = 1 And Bit2 = 0 And Bit4 = 1 And Bit8 = 0 Then Stellung = 5 jmp anfang: End If If Bit1 = 0 And Bit2 = 1 And Bit4 = 1 And Bit8 = 0 Then Stellung = 6 jmp anfang: End If If Bit1 = 1 And Bit2 = 1 And Bit4 = 1 And Bit8 = 0 Then Stellung = 7 jmp anfang: End If If Bit1 = 0 And Bit2 = 0 And Bit4 = 0 And Bit8 = 1 Then Stellung = 8 jmp anfang: End If If Bit1 = 1 And Bit2 = 0 And Bit4 = 0 And Bit8 = 1 Then Stellung = 9 jmp anfang: End If Return
Hallo Robert, die Auswahl im Interrupt auszuführen ist m.E. vollkommen unnötig - lass es weg. Lass das "do loop" innerhalb "if Stellung =" weg und die Auswahl geht immer. Gruss Otto
und ruf "BCD_Auswahl" immer nach dem 1. "do" auf Otto
Hilfe... geht das auch in C ? **duck und weg**
Hallo, @Matthias: warum? Auch BasCom kann SELECT CASE... Naja, Assembler wäre mir trotzdem lieber. ;-) Gruß aus Berlin Michael
> Config Pind.2 = Input 'PIN C 0 EINGANG
Interessante Kombination aus Code und Kommentar.
A.K. wrote: >> Config Pind.2 = Input 'PIN C 0 EINGANG > > Interessante Kombination aus Code und Kommentar. SORRY
Unten stehend ist der aktuelle stand, hätte jedoch gerne eine andere
lösung als alle 20 Durchläufe wieder komplett zu laufen.
Und wie bekomm ich das hin das der Taster nur "On demand" abgefragt
wird, also am besten halt über einen interrupt und dann wieder an den
Anfang des Hauptprogrammes springen.
Und als Sahnestück halt noch das Dimmen? Wie bekomm ich das lauffähig in
ein Unterprogramm.
Wegen Select Case habe ich schon probiert, jedoch fehlt mir
warscheinlich ein Parameter um alle 4 Bits gleichzeitig abzufragen.
$regfile = "m8def.dat"
$crystal = 8000000
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.5 = Input
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Output
Config Pinc.5 = Output
Rr Alias Portc.2
Gr Alias Portc.0
Br Alias Portc.1
Rl Alias Portc.5
Gl Alias Portc.3
Bl Alias Portc.4
Bit1 Alias Pind.2
Bit2 Alias Pind.3
Bit4 Alias Pind.4
Bit8 Alias Pind.5
Declare Sub Bcd_auswahl
Dim Stellung As Byte
Dim Pwm As Byte
Dim Warte As Byte
Warte = 1
Stellung = 0
Do
Anfang:
Call Bcd_auswahl
If Stellung = 0 Then
Rl = 0
Rr = 0
Gl = 0
Gr = 0
Bl = 0
Br = 0
End If
If Stellung = 1 Then
Rr = 1
Rl = 1
Gr = 0
Gl = 0
Br = 0
Bl = 0
End If
If Stellung = 2 Then
Rr = 0
Rl = 0
Gl = 1
Gr = 1
Bl = 0
Br= 0
End If
If Stellung = 3 Then
Rr = 0
Rl = 0
Gl = 0
Gr = 0
Bl = 1
Br = 1
End If
If Stellung = 4 Then
Rl = 1
Rr = 1
Waitms 4
Gl = 1
Gr = 1
Waitms 2
Gl = 0
Gr = 0
Bl = 0
Br= 0
End If
If Stellung = 5 Then
Rl = 0
Rr = 0
Gl = 1
Gr = 1
Bl = 1
Br = 1
End If
If Stellung = 6 Then
Rr = 1
Rl = 1
Gr = 0
Gl = 0
Br= 1
Bl = 1
End If
If Stellung = 7 Then
Pwm = 0
Do
Gr = 0
Gl = 0
Br = 1
Bl = 1
Rr = 1
Rl = 1
Waitms Pwm
Rr = 0
Rl = 0
Waitms 10
Pwm = Pwm + 1
Loop Until Pwm = 20
End If
Sub Bcd_auswahl
If Bit1 = 0 And Bit2 = 0 And Bit4 = 0 And Bit8 = 0 Then 'BCD
Schalter auf 0
Stellung = 0
End If
If Bit1 = 1 And Bit2 = 0 And Bit4 = 0 And Bit8 = 0 Then 'BCD
Schalter auf 1
Stellung = 1
End If
If Bit1 = 0 And Bit2 = 1 And Bit4 = 0 And Bit8 = 0 Then 'BCD
Schalter auf 2
Stellung = 2
End If
If Bit1 = 1 And Bit2 = 1 And Bit4 = 0 And Bit8 = 0 Then 'BCD
Schalter auf 3
Stellung = 3
End If
If Bit1 = 0 And Bit2 = 0 And Bit4 = 1 And Bit8 = 0 Then 'BCD
Schalter auf 4
Stellung = 4
End If
If Bit1 = 1 And Bit2 = 0 And Bit4 = 1 And Bit8 = 0 Then 'BCD
Schalter auf 5
Stellung = 5
End If
If Bit1 = 0 And Bit2 = 1 And Bit4 = 1 And Bit8 = 0 Then 'BCD
Schalter auf 6
Stellung = 6
End If
If Bit1 = 1 And Bit2 = 1 And Bit4 = 1 And Bit8 = 0 Then 'BCD
Schalter auf 7
Stellung = 7
End If
If Bit1 = 0 And Bit2 = 0 And Bit4 = 0 And Bit8 = 1 Then 'BCD
Schalter auf 8
Stellung = 8
End If
If Bit1 = 1 And Bit2 = 0 And Bit4 = 0 And Bit8 = 1 Then 'BCD
Schalter auf 9
Stellung = 9
End If
End Sub
Loop
Hallo, naja, man kann es natürlich chaotisch genug machen... ;) Die 4 Bit eines BCD-Schalters stellen ja direkt die Werte 0000 - 1001 dar, sonst wäre er ja keiner. Man sollte die natürlich nicht erst auseinanderreißen, um sie dann mühsam wieder zusammenzubasteln. Den Kram vom Port als komplettes Byte eingelesen, bei Deiner Beschaltung um 2 Bit nach rechts verschoben und die oberen 4 Bit ausmaskieren. Schon steht in der Variablen die Nummer der Schalterstellung. Benutze kein BasCom, in Assembler würde es so aussehen: .def drehschalter = r16 in drehschalter,PIND ; jetzt haben wir den ganzen Port lsr drehschalter ; 2x rechts schieben, um von Bit5..Bit2 zu Bit3...Bit0 zu kommen lsr drehschalter andi drehschalter,0x0F ; obere 4 Bit auf 0 setzen nun steht in Drehschalter der Wert 0...9 für die Schalterstellung... Gruß aus Berlin Michael
Ok vielen dank leider kann ich überhaupt kein Assembler ! Htte in Bascom ja auch schon den Gedanken den ganzen Schalter einzulesen als String.. doch wie man das umsetzt hab ich keine Ahnung.
Hallo, ich habe mal spaßeshalber Deine eine Subroutine aufgeräumt. Allerdings nur mal schnell aus der BasCom-Doku die Befehle rausgesucht, falls da was am Format nicht stimmt, muß Du selber schauen. Ich benutze kein BasCom, will es auch nur zum Test für solche Sachen nicht unbedingt installieren. Ist nur als Denkansatz gedacht... Gruß aus Berlin Michael
Hallo,
kommt davon, wenn man es so eilig hat... :-(
$regfile = "m8def.dat"
$crystal = 8000000
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.5 = Input
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Output
Config Pinc.5 = Output
Rr Alias Portc.2
Gr Alias Portc.0
Br Alias Portc.1
Rl Alias Portc.5
Gl Alias Portc.3
Bl Alias Portc.4
Schalter Alias Pind
Declare Sub Bcd_auswahl
Dim Stellung As Byte
Dim Pwm As Byte
Dim Warte As Byte
Warte = 1
Stellung = 0
Do
Anfang:
Call Bcd_auswahl
If Stellung = 0 Then
Rl = 0
Rr = 0
Gl = 0
Gr = 0
Bl = 0
Br = 0
End If
If Stellung = 1 Then
Rr = 1
Rl = 1
Gr = 0
Gl = 0
Br = 0
Bl = 0
End If
If Stellung = 2 Then
Rr = 0
Rl = 0
Gl = 1
Gr = 1
Bl = 0
Br= 0
End If
If Stellung = 3 Then
Rr = 0
Rl = 0
Gl = 0
Gr = 0
Bl = 1
Br = 1
End If
If Stellung = 4 Then
Rl = 1
Rr = 1
Waitms 4
Gl = 1
Gr = 1
Waitms 2
Gl = 0
Gr = 0
Bl = 0
Br= 0
End If
If Stellung = 5 Then
Rl = 0
Rr = 0
Gl = 1
Gr = 1
Bl = 1
Br = 1
End If
If Stellung = 6 Then
Rr = 1
Rl = 1
Gr = 0
Gl = 0
Br= 1
Bl = 1
End If
If Stellung = 7 Then
Pwm = 0
Do
Gr = 0
Gl = 0
Br = 1
Bl = 1
Rr = 1
Rl = 1
Waitms Pwm
Rr = 0
Rl = 0
Waitms 10
Pwm = Pwm + 1
Loop Until Pwm = 20
End If
Sub Bcd_auswahl
Stellung = Schalter
SHIFT Stellung,RIGHT,2
Stellung = Stellung AND &H0F
End Sub
Loop
Gruß aus Berlin
Michael
Zur Not kann man das ja immer noch so machen Stellung = 8 * Bit3 + 4 * Bit2 + 2 * Bit1 + Bit0 Da aber BASCOM derart komplexe Berechnungen nicht erlaubt, musst du halt die ganzen Berechnungen einzeln aufdröseln. Aber das einfachste ist es sicherlich, wie Michael schon sagte: Vergiss das ganze Einzelbitabfragen. Braucht kein Mensch. Lies den Port als ganzes ein und danach setzt du gezielt alle Bits die du nicht brauchst mit einem AND auf 0. Danach noch um 2 Bits nach rechts schieben (das ist eine Division durch 4) und fertig.
Danke für die Antworten. Wo steht jetzt in dem neuen Sub mein Portname ? Wie bekomme ich jetzt noch zeitkritische Abläufe hin (PWM) also in den Unterprogrammen MfG, Neostrider
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.