@ Flicflac
Zu 1:
Habe ich dich richtig verstanden, das der Pegel am Eingang, wo MISO/MOSI und SLK anliegen nicht über 3,5V kommen?
Also da dort nur eine 5,1V-Z-Diode gegen masse liegt, dürfte das eigendlich nicht passieren!
Erklärung 1:
Du hast das Programierkabel noch drann, und das ziehr über den R die Spannung runter, weil am eingang -12V oder 0V anliegen.
Erklärung 2:
Die Z-Dioden sind nicht in ordnung.Dann andere einsetzen, oder gleich 5,6V-Typen, das ist aber der Grenzwert. Ich hatte es mal in einer Schutzbeschaltung mit 4,7V-Z-Dioden probiert und ähnliche Probleme. Jetzt habe ich in meiner Schutzschaltung 5,6V-Typen drin. Aber da du ja ständig die Z-Diode in den Z-Bereich fährst ist an dieser stelle eine 5,6V-Type extrem kritisch ( = kann gefährlich für den Chip werden)
Zu 2.
Ob der interne Pull-up-R reicht ist vom Ausgangswiderstand des Steuerbausteins abhängik. Ist der zu niederohmig im H-Zustand kann es zu fehldeutungen kommen, dürfte aber selten sein.
Im Zweifellsfall ein Widerstandsarray einplanen, das sind diese schwarzen "kämme", in denen 8 Widerstände von 8 Pin auf einen gemeinsamen 8. geschaltet sind. Kostet auch nicht die welt, und wenn ein ganzes Port als eingang genutzt wird, dann reicht eine Lötaugenreihe neben den Pins, und der 9. dann an Ub.
Werden nicht alle ports als eingang genommen, einfach entsprechendes Bein vom array abschneiden oder weg biegen.
Zu 3:
Da kann ich nur fürs AVR-Studio sprechen.
Einzelpinabfrage kann auf verschiedene wege erfolgen. Hatte ich in meinen Beispielen schon mal genutzt.
Befehl:
sbis/sbic/sbrs/sbrc
Funktion Überspringt nächsten befehl, wenn Bit vom Inputport/Register Set/claer (= gesetzt/gelöscht; 1/0) ist
Beispiel:
.def portA = 0x.. ;(Registeradresse für AusgangsportA laut Datenblatt)
.def w4s = 0 ;(
Weiche 4 Stamgleis auf Pin 0)
.def w4a = 1 ;(Weiche 4 Abzweiggleis auf Pin 1)
.def w5s = 2
.def w5a = 3
,def pinB = 0x.. ;(Registeradresse für eingangsportb laut Datenblatt)
.def TA1 =0
.def TA2 =1
.def TA3 =2
:
:
:
ldi r20.FF
out pinb-2,r20 ; Eingangspullupwiderstände Einschalten
out portb,r20 ; Port B auf High setzen, damit die Weichen nicht angesteuert werden
out Portb+1,r20 ; Port B auf Ausgang Stellen
:
:
:
tastaturabfrage:
sbis pinb, ta1 :Taste1 gedrückt?
rjmp gleis1 ;Ja, Springe zum Weichen stellen
sbis pinb, ta2 :Taste2 gedrückt?
rjmp gleis2 ;Ja, Springe zum Weichen stellen
sbis pinb, ta3 :Taste3 gedrückt?
rjmp gleis3 ;Ja, Springe zum Weichen stellen
ldi r20,0xFF ;keine Taste gedrückt, alle ausgänge Setzen
out porta,r20
rjmp tastaturabfrage;Tastaturabfrageschleife wiederholen
Gleis1: ; Weichen für Gleis 1
cbi porta,w4s ;Weiche 4 auf Stammgleis
sbi porta,w4a
cbi porta,w5s ;Weiche 5 auf Stammgleis
sbi porta,w5a
rjmp tastaturabfrage
Gleis2:
cbi porta,w4s
sbi porta,w4a
sbi porta,w5s
cbi porta,w5a
rjmp tastaturabfrage
Gleis3:
sbi porta,w4s
cbi porta,w4a
rjmp tastaturabfrage
Mit diesem Programmstück wird
1. Adresse der Ausgänge Port A Definiert (0x00-0xFF = Hexa; 0-255 = Dezimal; 0b00000000-0b11111111 als Binär)
2. Die Bits (Pins) den Weichenstellungen zugeordnet (0-7 = Pin 0-Pin7)
3. Adresse der Eingänge Port B Definiert (wie 1.)
4. Die Bits (Pins)der Taster zugeordnet
5. Platz für nötige Initialisierung der Ports (nicht komplett geschrieben)
6. Tastaturabfrageschleife. Hier wird solange gekreist, bis ein Eingang von einer Taste auf Low gezogen wird. Ist keine Taste gedrückt, werden alle Weichenausgänge auf Hihg geschltet, so das die angeschlossenen Optokoppler (gegen + geschaltet) nicht leuchten, und somit die Weichen nicht angesteuert werden.
7. Ist eine Taste gedrückt, so werden die Weichen so angesteuert, das die Weichenstraße auf das Gleis weisen. Nicht benotigte Weichen (gleis 3 Weiche 5) werden nicht angesteuert. Danach wird die Tastaturabfrage weiter ausgeführt.
Werden 2 Tasten gedrückt, so hat die erste in der Abfragekette Priorität.
Sollte nix weiter Abgearbeitet werden, so währe das bereits ein Lauffähiges Programm zum Weichen stellen für die 3 Gleise einer Gleisharfe.
Da W4S genauso wie TA1 auf 0 Definirt sind, ist hier nur der PIN definier, nicht das Port! Wenn also bei der Abfrage stats TA1 W4S stehen würde, so währe das für uns beim lesen horender Blötsinn, der Prozessor würde jedoch problemlos laufen, da er beides mal nur Pin0 ddas Eingangsportes B abfragt.
Sollte dir das noch zu kompliziert sein, so könntest du Macros definiren. Das sähe dann so aus (die Definitionen von oben gelten weiter)
Macro setw4a
cbi porta,w4a
sbi porta,w4s
endmacro
Macro setw4s
sbi porta,w4a
cbi porta,w4s
endmacro
Im Programm stände dann:
Gleis1:
setw4s
setw5s
rjmp Tastaturabfrage
Der Compiler ersetzt dann immer deinen befehl "SET W_nr_Richtung) mit der dafür nötigen Befehlsfolge.
Mit der Mackrofunktion kannst du also eigene "Befehle" erfinden, die ganze Befehlsfolgen enthalten. So konnte man auch Signale einbinden, oder wenn der Timer genutzt wird ein Signal verzögert schalten.
Hoffe, das es für dich Brauchbar ist.