Hallo, ich habe hier zwar schon einige Beiträge gefunden zum Thema, aber keine konnten mir weiterhelfen. Ich bringe mir gerade selbst die Grundlagen in Sachen yC bei, aber komme selbst mit AVC Tutorial nicht weiter. Attiny 13 // Programmiersprache C Ich will einen einfachen Schalter bauen. Wenn an einem Port 5 Volt anliegen oder nicht, soll ein anderer PIN geschaltet werden... Hier das Programm: void main () { DDRB &= ~(1<<PB3); // PB3 auf Eingang PORTB |= (1<<PB3); // PullUp aktivieren DDRB |= (1 << PB4); // PB4 auf Ausgang while(1) { if (PORTB = (1<<PB3)) // Bedingung, dass an PB3 5 Volt anliegt { } else { PORTB |= (1<<PB4);//Wenn keine 5 Volt an PB3, dann PB4 auf high schalten } } } Danke im Voraus
> if (PORTB = (1<<PB3))
hier sollte der compier eine Warnung werfen die du beachten solltest.
Bastler schrieb: > Ich bringe mir gerade selbst die Grundlagen in Sachen yC bei, aber komme > selbst mit AVC Tutorial nicht weiter. Dann machst du etwas falsch. Bastler schrieb: > Danke im Voraus Wofür? Irgendwie fehlt die Fragen zu deinem Thema.
> if (PORTB = (1<<PB3)) // Bedingung, dass an PB3 5 Volt anliegt
if ( (PINB & (1 << PB3)) == (1 << PB3) ) ...
- auf das doppelte Gleichheitszeichen achten!
- PINB (Eingänge), statt PORTB (Ausgänge) verwenden
oder
if ( PINB & (1 << PB3) ) ...
- ist wahr, wenn der Portpin PB3 High ist
- ist unwahr, wenn der Portpin PB3 Low ist
Danke für die schnelle Antworten if(PINB & (1<<3)) { } else { PORTB |= (1<<PB4); } das läuft aber auch nicht
Bastler schrieb: > das läuft aber auch nicht Dir ist schon klar, dass du damit einen Low-Aktiv Eingang hast? Also musst du den PB3 auf Masse ziehen, damit PB4 gesetzt wird. Eventuell solltest du dir auch noch gedanken machen, wie du den PB4 wieder zurücksetzten möchtest.
Und bitte: zeig immer ausnahmslos dein vollständiges Programm! (Und ein wenig Arbeit an deiner Codeformatierung würde auch nicht schaden. Es dürfte kein Zufall sein, dass immer die mit dem scheuslichsten und unübersichtlichsten Code diejenigen sind, bei denen nichts funktioniert. Fang nicht irgendwann damit an, nicht nachher, nicht in 2 Wochen, nicht wenn die Programme umfangreicher werden sondern JETZT! Konsistente Einrückung ist kein Selbstzweck sondern eine Hilfe für den Programmierer.)
Ja so funktioniert das jetzt, wenn PB3 auf Masse gezogen wir schaltet PB4....ich versuche jetzt mal das ganze herum zu drehen, also das PB4 schaltet, wenn PB3 5 volt anliegt und wenn PB3 auf Masse geht PB4 auf low gesetzt wird
Bastler schrieb: > ich versuche jetzt mal Nicht versuchen, Tu es! Wobei ich denke, dass dir nicht klar ist was du da tust. Dein PB3 hat einen Pull-Up, daher wird dein Taster oder Schalter immer auf Masse ziehen müssen bei Betätigung. Es sei denn, du deaktivierst den Pull-Up und schaltest einen Pull-Down extern dran. Und noch ein Tipp zum setzen und löschen von Bits: http://www.mikrocontroller.net/articles/Bitmanipulation
Ich glaub jetzt hab ich das mit dem Pull Ups verstanden. So läuft das ganze jetzt auf ein High Signal mit Pull Down Widerstand void main () { DDRB &= ~(1<<PB3); // PB3 auf Eingang DDRB |= (1 << PB4); // PB4 auf Ausgang while(1) { if ( (PINB & (1 << PB3)) == (1 << PB3) ) { PORTB |= (1<<PB4); } else { } } } Aber verstehe ich das richtig, PORT benutze ich immer bei Ausgängen, PIN immer bei Eingängen Vielen Dank Steve F. !!!!!
Das sind Register. Gut beschrieben ist das hier: http://www.embedds.com/controlling-avr-io-ports-with-avr-gcc/ Der PB4 wird aber immer noch nicht zurückgesetzt.
Nee, daran bin ich ja jetzt am arbeiten ;-)....wie baue ich mir einen Taster der nacheinander verschieden Programmteile ablaufen lässt.
Bastler schrieb: > void main () > > { > DDRB &= ~(1<<PB3); // PB3 auf Eingang > > DDRB |= (1 << PB4); // PB4 auf Ausgang > > while(1) > > { > if ( (PINB & (1 << PB3)) == (1 << PB3) ) > > { > > PORTB |= (1<<PB4); > > } > > else > > { > > > > } > > > } Karl Heinz Buchegger schrieb: > Und ein wenig Arbeit an deiner Codeformatierung würde auch nicht > schaden. Auch wenn es funktioniert, solltest du dir das zu Herzen nehmen.
1 | int main (void) |
2 | {
|
3 | DDRB &= ~(1 << PB3); // PB3 auf Eingang |
4 | DDRB |= (1 << PB4); // PB4 auf Ausgang |
5 | |
6 | while(1) |
7 | {
|
8 | if(PINB & (1 << PB3)) |
9 | {
|
10 | PORTB |= (1 << PB4); |
11 | }
|
12 | else
|
13 | {
|
14 | PORTB &= ~(1 << PB4); |
15 | }
|
16 | }
|
17 | }
|
So muss das aussehen. Da erkennt man auf einen Blick, was wie zusammengehört. Deins sieht aus wie hingeschissen. Die Leerzeichen vor und nach den Operatoren sind natürlich Geschmackssache. Aber wenn, dann auch konsequent. mfg.
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.