hi leutz, ich hab ja nun eigentlich die wesntlichsten sachen verstanden,aber ein problem hab ich noch.ich kann zwar einzelne pins durch sbi und cbi als ausgänge setzen aber wie kann ich einzelne pins auslesen. beispiel: ich möchte den pin PD0 auslesen und ihn auf eine variable schreiben. int taster; if (taster ==1) { .... } den einzigsten befehl den ich kenne ist inp (PIND) danke für eure hilfe ciao peter
Da bei mir die Taster einen Pin immer gegen GND ziehen (Low-Aktiv) müsste die Zeile von Dirk so abgeändert werden: if (!(PIND & _BV(PD0))) { ... } Das Prinzip sollte aber klar sein :-)
dank dir, kannst du mir noch sagen was _BV bedeutet und ob ich dafür eine header - datei einbinden muss?
_BV bedeutet Bit Value. _BV(3) => 1 << 3 => 0x08 siehe http://jubal.westnet.com/AVR/doc/avr-libc-user-manual/ bei den Faq Gruss Dirk
Hi Demerzel, ich gehe so vor: ich definiere die Register und die Bitnummer für einen Pin, auf den ich zugreifen will: #define taster_bit 1 // 0 bis 7 erlaubt #define taster_pin PINC #define taster_port PORTC #define taster_ddr DDRC Diese Definitionen mache ich für alle Pins des AVR, die auf meiner Platine eine spezielle Funktion haben und packe sie in die Datei hardware_soundso.h. Im Programm greife ich dann so darauf zu (Taster low-aktiv): if (!(taster_pin & _BV(taster_bit))) { ... } Für _BV musst Du einbinden: #include <avr/io.h> Viel Spass, Stefan
Außerdem hast Du offensichtlich noch nicht alles verstanden, sonst hättest Du verstanden, daß man sbi() und cbi() nicht mehr benutzen soll. ;-) (In der Tat gibt es sie in der Entwicklerversion der avr-libc bereits nicht mehr.) Man benutzt auch dafür (genau wie für die Eingabe) die Bitmanipulationsoperatoren aus der C-Hausapotheke. Die Doku zur avr-libc steht übrigens offiziell unter http://www.nongnu.org/avr-libc/user-manual/index.html jubal.westnet.com war nur ein Ausweichstandort.
danke leute, eure antworten haben mir super geholfen. @ jörg: danke das du mich aufgeklärt hast das man sbi und cbi nicht mehr benutzt - ich bin da nicht so auf dem laufendem was gerade im augenblick bei der programmierung " in " ist. nächstes jahr ist eh alles wieder anders ;-) ciao and have a nice day peter
Hi Demerzel, das hat nichts mit "in" zu tun, sondern der Tip von Jörg soll Dich davor bewahren, Code zu schreiben, der mit der nächsten WINAVR-Version nicht mehr übersetzbar sein wird. Und uns natürlcih vor dem Gejammere "Hilfeee, die neue WINAVR-Version macht lauter Fehler ...". So long, Stefan
cbi und sbi waren nicht "in", sondern waren einstmals einfach nur Hacks, um im AVR-GCC (bzw. der AVR-LIBC) überhaupt einen Zugriff auf einzelne IO-Bits zu ermöglichen (genauso wie inb und outb). Mittlerweile ist aber eine Methode implementiert, die erstens kompatibel zur gängigen Atmel-Syntax (und damit auch zu allen anderen AVR-C-Compilern) ist und die zweitens ausschließlich mit Standard-C-Konstrukten (Bitoperatoren eben) auskommt, so daß die ursprünglichen Hacks auf dem Müllhaufen der Geschichte gelandet sind. Ähnlich wird sicher __attribute__((progmem)) (hoffentlich) irgendwann mal auf dem Müllhaufen der Geschichte landen und durch dann hoffentlich mal implementierte memory spaces ersetzt werden, die einer dann hoffentlich verabschiedeten Erweiterung des C-Standards für memory spaces genügen werden, so daß wieder ein lokaler Hack weniger nötig sein wird. Aber bis dahin fließt auf jeden Fall noch viel Wasser die Elbe und den Rhein hinunter...
Hi um die Zugriffe auf externe Hardware zu vereinfach mach ich in einer hardware.h (wird gleich zu Beginn des Projekts aus dem Schaltplan erstellt) für alle I/O-Signale sowas: //Ausgänge #define LED_ON PORTC|=(1<<3) #define LED_OFF PORTC&=(unsigned char)(~(1<<3)) //Eingänge #define IN_KEY1 (PINC&(1<<6)) Dann schreibt sich das Einschalten einer LED einfach: LED_ON; bzw. die Abfrage auf Taste 1: if(IN_KEY1); Matthias
danke nochmal allen - hoffe es hilft auch anderen.(nix gegen das tutorial aber mir hilft es einfach mehr wenn ich meine gedanken hier poste und dann auf die punkte bei denen ich probleme habe speziell eine antwort bekomme)ciao peter
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.