Forum: Mikrocontroller und Digitale Elektronik code von http://www.zabex.de/site/schaltungstechnik.html


von srobs (Gast)


Lesenswert?

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

von Clemens K. (clemensk)


Lesenswert?

du musst den header einbinden sonst weiß der compiler nicht was ddrb 
ist.

von srobs (Gast)


Lesenswert?

die komische Schreibweise des bit Deklaration habe ich schon geändert 
aber es kamen mehr fehler.

von srobs (Gast)


Lesenswert?

ach scheiße. wie peinlich :D garnicht drauf geachtet. sorry


danke.!!!

von Clemens K. (clemensk)


Lesenswert?

Leg mal ein neues Projekt mit Atmel Studio an. Compiliere das Projekt. 
Wenn das geht kopiere mal diesen Quellcode rein.

von srobs (Gast)


Lesenswert?

was war der header für cli

von GerryLenz (Gast)


Lesenswert?

interrupt.h

von srobs (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.