Guten Morgen,
möchte mit einem Atiny2313 eine kleine Steuerung machen..
Nix besonderes, er fragt 3 Pin's ab ( wo ein später "Taster" ran kommen,
im Moment nur simuliert ) und soll je 2 Pin's high oder low setzten.
Macht er auch, aber, die Zeiten sind willkürlich. Die 2 Sek. macht er
bei Position 2 aber bei Position 1 hängt er sich lange auf, manchmal
aber macht er auch nur 2 Sek. und schalten normal um. Programmiert wird
er über ISP mit dem AVRISP mkII. Die Fuses sind auch eigentlich richtig
gesetzt. Hier mal der Code, eventuell könnt ihr mir weiter helfen .
Was mir als erstes auffält:
Brauchst du keine Pullup Widerstände?
Es ist in Irrglaube, dass ein Eingang an dem nichts hängt, ein
0-Potential hätte! So ein Eingang ist hochohmig genug, dass er sich
jedes dahergelaufene elektromagnetische Feld einfängt. Und davon haben
wir genügend in unserer Umgebung: Handies, Elektromotoren, du selbst
fungierst als Antenne, die Stromleitungen in der Wand, dein PC, etc.
etc.
Bitte erkläre uns warum Du ein "musst hast.
Jakob schrieb:> Ich werde mal Pull-Down Widerstände einbauen. Da ich, wenn nix anliegt,> das Potenzial auf GND haben muss.
Wie meinen sie das mit "Bitte erkläre uns warum Du ein "musst hast".
Das Potenzial der Eingänge ziehe ich bei nicht anliegen Signal gegen
GND. Damit auch 0 Anliegt.
Jakob schrieb:> Ich werde mal Pull-Down Widerstände einbauen. Da ich, wenn nix anliegt,> das Potenzial auf GND haben muss.
Du brauchst es nur richtig rum programmieren und später die taster
richtig rum anschliessen, dann kannst du die eingebauten Pullup
Widerstände benutzen.
Ob du einen Pin mit
1
if(PINB&(1<<PB0))
abfrägst, oder mit
1
if(!(PINB&(1<<PB0))
ist doch Komplexitätsmässig völlig egal.
Im einfachsten Fall macht man sich dafür ein Makro
1
#define IS_PRESSED(p,b) (!(p & (1<<b)))
, schreibt im Code dann
1
if(IS_PRESSED(PINB,PB0))
und ist damit im Code die Details, ob die Taster nach GND oder nach Vcc
schalten, los. Im eigentlichen Programm interessiert das dann überhaupt
nicht mehr, denn da erhebt sich dann bei den Abfragen nur mehr die
Frage: gedrückt oder nicht gedrückt. Das Detail, das gedrückt ein 0 Bit
bedeutet braucht man im Code dann überhaupt nicht mehr berücksichtigen.
Dieses Detail kommt durch die Makro-Ersetzung für den Compiler wieder
ins Spiel, aber mich als menschlichen Programmierer kümmert es nicht
mehr. Denn ich als Programmierer denke nicht in 0 oder 1 Bits, sondern
in gedrückten oder nicht gedrückten Tasten. Und genau das steht dann
auch so im Code.
Wenn etwas gemacht werden soll, wenn 2 Taster gleichzeitig gedrückt
sind, dann eben:
1
if(IS_PRESSED(PINB,PB0)&&
2
IS_PRESSED(PINB,PB3))
3
...
und da kann man doch (fast) nicht mehr meckern. Das liest sich im C Code
dann schon ganz gut.
Wenn man die Pinnummern mittels #define auf einen sprechenden Namen
rauszieht
1
#define MASTER_KEY PB3
2
#define DOOR_UP PB0
3
4
....
5
6
if(IS_PRESSED(PINB,MASTER_KEY)&&
7
IS_PRESSED(PINB,DOOR_UP))
8
9
..
dann hat man plötzlich eine ganz andere Code Qualität, weil der Code
selber schon fast ein englischer Satz ist, der mir erzählt, worum es an
dieser Stelle im Code geht.
Fazit: Lerne dein C! Dann verliert vieles, von dem du dich jetzt
fürchtest seinen Schrecken, weil du weißt, wie man das in C so
formulieren kann, dass es überhaupt kein Problem mehr ist.
Was du jetzt auch lernen musst: wie kann ich die Möglichkeiten von C
einsetzen um mir selbst das Leben leichter zu machen?
Es ist keineswegs Gott gegeben, dass in einem C Programm es nur so von
unverständlichen Bit-Ausdrücken wimmelt, über die man erst mal 3 Minuten
brüten muss, um sie zu verstehen oder die nur mit großem Aufwand zu
ändern sind. Das alles liegt in deiner Hand, dir das so zu organisieren,
dass es kein Problem darstellt. Die Sprache gibt dir die Mittel dazu.
Aber benutzen musst schon du diese Mittel.
Hab immer noch ein Problem.
Erstmal danke an Karl Heinz für den Tipp, werde ihn anwenden wenn ich
das Problem gefunden habe.
Hab das Programm mal auf Pull-Up geschrieben...#
Das Programm sollte alle 1,5sek zwischen den beiden Positionen wechseln,
hängt sich aber bei jetzt bei Position 2 auf. Ist hier im Programm ein
sehr grober Fehler ? Weil in der Verdrahtung stimmt alles. Oder kann der
2313 ein hau weg haben ? Oder braucht der einen externen Ozi ?
Jakob schrieb:> Das Programm sollte alle 1,5sek zwischen den beiden Positionen wechseln
Warum sollte es das tun?
> (!(PIND & (1<<PINB4)))
Es sind zwar nur #defines, aber es sieht seltsam aus...
Jakob schrieb:> Hab immer noch ein Problem.> Erstmal danke an Karl Heinz für den Tipp, werde ihn anwenden wenn ich> das Problem gefunden habe.
Tja. Hättest du das mal gleich gemacht
Die Sichtweise "Ich will jetzt erst mal haben das es funktioniert und
dann kümmere ich mich darum, dass es 'schön' ist" ist die falsche
Sichtweise. Denn sie übersieht, dass man sich viele blödsinnige Fehler
spart, wenn man gleich ein 'schönes', übersichtliches Programm schreibt.
Du darfst dir selbst als Programmierer möglichst wenig Tüchen offen
lassen, in denen du Fehler machen kannst. Und das interessante daran: in
den meisten Fällen führt genau dieses 'Schliessen von Türchen' zu den
bereits genannten Techniken, mit denen ein Programm 'schöner' wird und
auch qualitativ einen Schritt nach vorne macht.
Dazu gehören im Übrigen auch vernünftige Einrückungen im Code, so dass
man die generelle Struktur, erkennt. Dazu gehören auch vernünftige
Variablennamen. Dazu gehört auch, dass man zb so was
1
if(auf==1)
2
{
3
PORTD=0b11011110;//Position 1
4
5
}
6
7
if(auf==0)
8
{
9
PORTD=0b11101111;//Position 2
10
11
}
nicht schreibt, denn das 'else' als Ausdruck für 'wenn - dann -
andernfalls' ist schon erfunden, so dass man nicht 2 Abfragen mit
gegensätzlichen Bedingungen schreiben muss, in denen man Gefahr läuft
die beiden Abfragen zu verbocken.
Was soll das eigentlich für eine Steuerung werden?
Dein Code und vor allen Dingen die vielen Variablen, kommen mir ein
wenig viel und recht unübersichtlich vor.
Das sieht fast aus wie eine Türsteuerung oder so ähnlich. Ein Taster ist
den Bedientaste, die anderen beiden sind Endschalter und am Port D hängt
u.A. eine H-Brücke, mit der ein Motor vorwärts/rückwärts gefahren werden
kann.
Aber so recht ist das Ziel des ganzen nicht erkennbar. Ich sag
absichtlich 'fast', denn so richtig stimmt das Ganze dann auch wieder
nicht. Ich bin mir nur noch nicht im klaren, ob das daran liegt, dass
ich die Aufgabenstellung nicht kenne, oder daran, dass da grundsätzlich
schon mal der Wurm drinnen ist.