Guten Abend. Für mein momentanes Projekt, brauche ich einen Berührungstaster. Auf der Seite: http://www.zabex.de/site/schaltungstechnik.html habe ich folgenden Code gefunden.: /*---------------------------------------------------------------------- -------------------------------------- Realisiert mit Tiny13 Interner Oszillator mit rund 4MHz Layout: 1 ° 8 +5V Beruehrung erkannt(PB3) 2 7 PB2 3 6 PB1: C und Sensor GND 4 5 PB0: C Input: PB0: Messspannung und Kondensator PB1: Kondensator und Sensoranschluss Output: PB1: Kondensator und Sensor PB0: Kondensator PB3: Meldung: Beruehrung erkannt! Kondensator 33nF zwischen PB0 und PB1 Sensor an PB1 Ablauf: 1) PB1 und PB0 L Kondensator leeren warte 1-10ms 2) PB1 offen, PB0 H Ladung übertragen 3) PB0 offen 4) PB1 L, 5) PB0 misst Ladung messen Weiter bei 2 solange PB0 L 6) gehe zu 1 */ //---------------------------------------------------------------------- -------------------------------------- void delay_250us(void){ //Die Zeit stimmt nich mal annaehernd! static unsigned char i; i=100; do{ asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); }while (--i); } //---------------------------------------------------------------------- -------------------------------------- int main(void){ static int n; static long int summe; static int loops, grenze; static unsigned char i,init; cli(); init=1; DDRB = 1|2|8|16;//PB0 | PB1 | PB3 | PB4; //PB 0,1,3,4 sind Ausgang PORTB = 0; //Kondensator leeren delay_250us(); loops=0; summe=0; grenze=0; while(1){ DDRB = 1|8|16;//PB0 | PB3 | PB4; //PB1 auf Eingang PORTB = 0; //Kein Pull-Up an PB1 n=0; //Lade Kondensator und zaehle die Zyklen while(1){ DDRB = 1|8|16;//PB0 auf Ausgang PORTB |= 1; //PB0 H asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); n++; DDRB = 8|16; //PB0 wieder auf Eingang DDRB = 2|8|16; //PB1 jetzt auf Ausgang (PB0 auf Eingang) PORTB &= ~2; //PB1 L asm volatile("NOP"); if (1 & PINB) break; //Messen DDRB = 8|16;//Beide auf Eingang } DDRB = 1|2|8|16;//PB0 | PB1 | PB3 | PB4; //PB 0,1,3,4 sind Ausgang //Kondensator leeren, Berührung signalisieren if (n<grenze){ PORTB=8; //Berührung entdeckt }else{ PORTB=0; //keine Berührung entdeckt } if (init){ summe+=n; loops++; if (loops>100){ summe/=loops; grenze=(summe*96/100); loops=0; summe=0; init=0; } } for (i=0; i<200; i++){ delay_250us(); } } return 0; } was ist daran bitte falsch.? Somal ich den gleichen µC verwende wie es vorgeschrieben ist. Folgene Fehlermeldung: Error 2 'DDRB' undeclared (first use in this function) Error 4 'PORTB' undeclared (first use in this function) Error 5 'PINB' undeclared (first use in this function) Bitte helft mir. Ich brauche das dringend. danke euch
du musst den header einbinden sonst weiß der compiler nicht was ddrb ist.
die komische Schreibweise des bit Deklaration habe ich schon geändert aber es kamen mehr fehler.
ach scheiße. wie peinlich :D garnicht drauf geachtet. sorry danke.!!!
Leg mal ein neues Projekt mit Atmel Studio an. Compiliere das Projekt. Wenn das geht kopiere mal diesen Quellcode rein.
GerryLenz schrieb: > interrupt.h atomic geht auch ;) funktioneller code: /*---------------------------------------------------------------------- -------------------------------------- Realisiert mit Tiny13 Interner Oszillator mit rund 4MHz Layout: 1 ° 8 +5V Beruehrung erkannt(PB3) 2 7 PB2 3 6 PB1: C und Sensor GND 4 5 PB0: C Input: PB0: Messspannung und Kondensator PB1: Kondensator und Sensoranschluss Output: PB1: Kondensator und Sensor PB0: Kondensator PB3: Meldung: Beruehrung erkannt! Kondensator 33nF zwischen PB0 und PB1 Sensor an PB1 Ablauf: 1) PB1 und PB0 L Kondensator leeren warte 1-10ms 2) PB1 offen, PB0 H Ladung übertragen 3) PB0 offen 4) PB1 L, 5) PB0 misst Ladung messen Weiter bei 2 solange PB0 L 6) gehe zu 1 */ //---------------------------------------------------------------------- -------------------------------------- #include <avr/io.h> #include <util/atomic.h> void delay_250us(void){ //Die Zeit stimmt nich mal annaehernd! static unsigned char i; i=100; do{ asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); }while (--i); } //---------------------------------------------------------------------- -------------------------------------- int main(void){ static int n; static long int summe; static int loops, grenze; static unsigned char i,init; cli(); init=1; //DDRB |= 1|2|8|16;//PB0 | PB1 | PB3 | PB4; //PB 0,1,3,4 sind Ausgang DDRB |= 0xff; PORTB = 0; //Kondensator leeren delay_250us(); loops=0; summe=0; grenze=0; while(1){ DDRB = 1|8|16;//PB0 | PB3 | PB4; //PB1 auf Eingang PORTB = 0; //Kein Pull-Up an PB1 n=0; //Lade Kondensator und zaehle die Zyklen while(1){ DDRB = 1|8|16;//PB0 auf Ausgang PORTB |= 1; //PB0 H asm volatile("NOP"); asm volatile("NOP"); asm volatile("NOP"); n++; DDRB = 8|16; //PB0 wieder auf Eingang DDRB = 2|8|16; //PB1 jetzt auf Ausgang (PB0 auf Eingang) PORTB &= ~2; //PB1 L asm volatile("NOP"); if (1 & PINB) break; //Messen DDRB = 8|16;//Beide auf Eingang } DDRB = 1|2|8|16;//PB0 | PB1 | PB3 | PB4; //PB 0,1,3,4 sind Ausgang //Kondensator leeren, Berührung signalisieren if (n<grenze){ PORTB^=8; //Berührung entdeckt } // }else{ // PORTB=0; //keine Berührung entdeckt // } if (init){ summe+=n; loops++; if (loops>100){ summe/=loops; grenze=(summe*96/100); loops=0; summe=0; init=0; } } for (i=0; i<200; i++){ delay_250us(); } } return 0; } funktioniert einwandfrei
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.