Forum: Mikrocontroller und Digitale Elektronik Mega32 schaltet, ohne ein Signal zu bekommen


von ICH (Gast)


Lesenswert?

Hallo, ich habe mir eine einfach Schaltung mit einem Microkontroller 
gebaut.
Relativ simpel.
4 Schalter
1 Rest Schalter
ein 16.000 MHz Quarz mit 2pF Kondensaotren,
ein LCD
und das war's dann auch schon.
Jetzt habe ich nur das Problem, dass der Mega 32 durch das ganze 
Programm springt, obwohl er kein Signal von einem Taster bekommt.
Ich habe auch schon die Pins umgebogen, damit sie nicht mehr im Sockel 
sind.
Das Ergebnis ist immer noch das Gleiche.
Die Spannung habe ich von einem Schaltnetzteil.
Von 12 V auf 5,02 V mit 7809 und 7805 Spannugsreglern herunter geholt 
und mit Elkos geglättet.
Eine Brücke kann ich auch nirgends finden.
15 CM von meinem µC ist das Netzteil angebracht.
Ist es möglich, dass dieses meinen Prozi aus dem Takt wirft?
Solangsam gehen mir die Ideen aus.

Gruß

von Justus S. (jussa)


Lesenswert?

ICH schrieb:
> ein 16.000 MHz Quarz mit 2pF Kondensaotren,

in der Regel braucht man 22pF

und ohne eine einzige Zeile Programm oder Schaltplan wird dir auch 
niemand helfen können...

von Chris (Gast)


Lesenswert?

Ganz klar sorcecode fehler in zeile 42!

von Max (Gast)


Lesenswert?

@Chris: Nein Zeile 666, "DER TEUFEL IST SCHULD, VERBENNT IHN". "Hä wen, 
den Teufel ?"

von tom (Gast)


Lesenswert?

Da fehlt doch ein Widerstand

von Floh (Gast)


Lesenswert?

ICH schrieb:
> 4 Schalter

wie verschaltet?

von ICH (Gast)


Lesenswert?

#include <avr/io.h>
#include <stdint.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 
definiert"
#define F_CPU 8000000UL     /* Quarz mit 8 Mhz  */
#endif
#include <util/delay.h>
#include <stdlib.h>
#include "lcd-routines.h"
#include <string.h>

/*
*  ==================================================== Entprellen 
====================================================
*/

#define debounce( port, pin )                                        \
({                                                                   \
  static uint8_t flag = 0; /* new variable on every macro usage */   \
  uint8_t i = 0;                                                     \
                                                                     \
  if( flag ){                  /* check for key release: */          \
    for(;;){                   /* loop... */                         \
      if( (port & 1<<pin) ){   /* ... until key pressed or ... */    \
        i = 0;                 /* 0 = bounce */                      \
        break;                                                       \
      }                                                              \
      _delay_us( 98 );         /* * 256 = 25ms */                    \
      if( --i == 0 ){          /* ... until key >25ms released */    \
        flag = 0;              /* clear press flag */                \
        i = 0;                 /* 0 = key release debounced */       \
        break;                                                       \
      }                                                              \
    }                                                                \
  }else{                       /* else check for key press: */       \
    for(;;){                   /* loop ... */                        \
      if( !(port & 1<<pin) ){  /* ... until key released or ... */   \
        i = 0;                 /* 0 = bounce */                      \
        break;                                                       \
      }                                                              \
      _delay_us( 98 );         /* * 256 = 25ms */                    \
      if( --i == 0 ){          /* ... until key >25ms pressed */     \
        flag = 1;              /* set press flag */                  \
        i = 1;                 /* 1 = key press debounced */         \
        break;                                                       \
      }                                                              \
    }                                                                \
  }                                                                  \
  i;                           /* return value of Macro */           \
})


/*
*  ==================================================== Portzuweisungen 
====================================================
*/

/*
*  Port A    Menusteuerung
*
*  Port B  \
*       -  Schnaepse / Magnetventile
*  Port C  /
*
*  Port C    Luftsteuerung (Druckluft / Entlueftung)
*
*  Port D    Display (siehe lcd-routines.c/h)
*/

/*
*  Namen fuer Ports und Register
*/
// Taster
#define NavigationDirection DDRA  // Richtungsregister
#define NavigationPort PORTA    // Datenregister
#define NavigationIn PINA      // Eingangsregister

// Magnetventile (Schnaps / Luftsteuerung)
#define Vent1Direction DDRB      // Richtungsregister
#define Vent1Port PORTB        // Datenregister
#define Vent1In PINB        // Eingangsregister

#define Vent2Direction DDRC      // Richtungsregister
#define Vent2Port PORTC        // Datenregister
#define Vent2In PINC        // Eingangsregister


/*
*  Taster fuer Menunavigation
*  alle active high
*  Eingaenge
*/
#define menDown PA0    // eins nach unten
#define menUp PA1    // eins nach oben
#define menEnter PA2  // enter / bestaetigen
#define menBack PA3    // zurueck / abbrechen
#define menReset PA4  // CPU reset

/*
*  Zutaten (Schnaepse) bzw. zugehoerige Magnetventile
*  Ausgaenge
*/
#define Gin (1 << PB0)        // Gin
#define Rum (1 << PB1)        // Rum
#define Vodka (1 << PB2)      // Vodka
#define Tequila (1 << PB3)      // Tequila
#define Zitronensaft (1 << PB4)    // Zitronensaft
#define Orangensaft (1 << PB5)    // Orangensaft
#define TripleSec (1 << PB6)    // TripleSec
#define Cola1 (1 << PB7)      // Cola
#define Cola2 (1 << PC0)      // Cola
#define Cola3 (1 << PC1)      // Cola

/*
*  Luftsteuerung
*  Ausgaenge
*/
#define blast (1 << PC5)    // Ventil fuer Druckluft
#define aeration (1 << PC6)    // Ventil fuer Belueftung
#define vent (1 << PC7)      // Ventil fuer Entlueftung


/*
*  ==================================================== Glasgroessen 
====================================================
*/

/*
*  Glasgroessen
*/
#define small 4 // kleines Glas, 100 ml
#define medium 2 // mittelgrosses Glas, 200 ml
#define big 1 // grosses Glas, 400 ml

// aktuelle Glasgroesse
uint8_t glassSize = big;


/*
*  ==================================================== Durchlaufzeiten 
====================================================
*/

/*
*  Durchlaufzeit fuer 2cl in ms
*/
#define runTime 2000

/*
*  Pufferzeit, damit Ventile schalten koennen
*/
#define pufferTime 500

/*
*  ==================================================== Cocktails 
====================================================
*/

/*
*  Cocktails
*  jeder int steht fuer die Anzahl an 1cl-Portitionen der jeweiligen 
Zutat
*  Bsp.: gin = 2 ==> 2 * 1cl Gin = 2cl Gin
*/
typedef struct {
  uint8_t gin;    // Gin
  uint8_t rum;    // Rum
  uint8_t vodka;    // Vodka
  uint8_t tequila;  // Tequila
  uint8_t zitrone;  // Zitronensaft
  uint8_t orange;    // Orangensaft
  uint8_t tripleSec;  // TripleSec
  uint8_t cola;    // Cola
} cocktail;

/*
*  Long Island Iced Tea
*/
cocktail longIslandIcedTea = {2, 2, 2, 2, 2, 4, 2, 10};

/*
*  Vodka-O
*/
cocktail vodkaO = {0, 0, 4, 0, 0, 16, 0, 0};

/*
*  Vodka-Cola
*/
cocktail vodkaCola = {0, 0, 4, 0, 0, 0, 16};


/*
*  ==================================================== Menueintraege 
====================================================
*/

/*
*  Menue-Eintrag
*  fuer Menubasierte Steuerung
*
*  subMenu != NULL && parMenu == NULL                   -> 
Top-Level-Eintrag
*  subMenu == NULL && parMenu != NULL && glassSz > 0           -> 
Glassgroesse-Eintrag
*  subMenu == NULL && parMenu != NULL && glassSz = 0 && drink != NULL 
-> Cocktail-Eintrag
*  subMenu == NULL && parMenu != NULl && glassSz = 0 && drink == NULL 
-> Impressum-Eintrag
*/
struct menuPoint {
  struct menuPoint *parMenu; // uebergeordneter Menuepunkt; NULL, falls 
keiner existiert
  struct menuPoint *subMenu; // Untermenue; NULL, falls keines existiert
  struct menuPoint *prev; // vorheriger Menueeintrag
  struct menuPoint *next; // naechster Menueeintrag
  uint8_t glassSz; // Glasgroesse
  cocktail *drink; // LowByte - Port B; HighByte - Port C
  char line1[17]; // Titel des Eintrags - Zeile 1
  char line2[17]; // Titel des Eintrags - Zeile 2
};


/*
*  ==================================================== Programm 
====================================================
*/

/*
*  Entprell-Methoden, um Entprellung an mehreren Stellen aufrufen zu 
koennen
*/
// nach-unten-Taster
uint8_t debounce_Down(void) {
  return debounce(NavigationIn, menDown);
}

// nach-oben-Taster
uint8_t debounce_Up(void) {
  return debounce(NavigationIn, menUp);
}

// enter-Taster
uint8_t debounce_Enter(void) {
  return debounce(NavigationIn, menEnter);
}

// zurueck-Taster
uint8_t debounce_Back(void) {
  return debounce(NavigationIn, menBack);
}

// Reset-Taster
uint8_t debounce_Reset(void) {
  return debounce(NavigationIn, menReset);
}


/*
*  Methode zur Initalisierung des Menues
*  gibt Pointer zu erstem Top-Level-Eintrag zurueck
*/
struct menuPoint *initMenu() {
  // Hauptmenue
  struct menuPoint *tlMenu = (struct menuPoint *) malloc(3 * 
sizeof(struct menuPoint));

  // Menue zum Einstellen der Glasgroesse
  struct menuPoint *glassSizeMenu = (struct menuPoint *) malloc(3 * 
sizeof(struct menuPoint));

  // Menue zur Cocktailauswahl
  struct menuPoint *cocktailMenu = (struct menuPoint *) malloc(3 * 
sizeof(struct menuPoint));

  // Menue Impressum
  struct menuPoint *imprint = (struct menuPoint *) malloc(sizeof(struct 
menuPoint));


  /*
  *  Glasgroesse
  */
  // kleines Glas
  glassSizeMenu[0].parMenu = tlMenu;
  glassSizeMenu[0].subMenu = NULL;
  glassSizeMenu[0].prev = &glassSizeMenu[2];
  glassSizeMenu[0].next = &glassSizeMenu[1];
  glassSizeMenu[0].glassSz = small;
  glassSizeMenu[0].drink = NULL;
  strcpy(glassSizeMenu[0].line1, "klein");
  strcpy(glassSizeMenu[0].line2, "100ml");

  // mittelgrosses Glas
  glassSizeMenu[1].parMenu = tlMenu;
  glassSizeMenu[1].subMenu = NULL;
  glassSizeMenu[1].prev = &glassSizeMenu[0];
  glassSizeMenu[1].next = &glassSizeMenu[2];
  glassSizeMenu[1].glassSz = medium;
  glassSizeMenu[1].drink = NULL;
  strcpy(glassSizeMenu[1].line1, "mittel");
  strcpy(glassSizeMenu[1].line2, "200ml");

  // grosses Glas
  glassSizeMenu[2].parMenu = tlMenu;
  glassSizeMenu[2].subMenu = NULL;
  glassSizeMenu[2].prev = &glassSizeMenu[1];
  glassSizeMenu[2].next = &glassSizeMenu[0];
  glassSizeMenu[2].glassSz = big;
  glassSizeMenu[2].drink = NULL;
  strcpy(glassSizeMenu[2].line1, "gross");
  strcpy(glassSizeMenu[2].line2, "400ml");

  /*
  *  Cocktails
  */
  // Long Island Iced Tea
  cocktailMenu[0].parMenu = tlMenu;
  cocktailMenu[0].subMenu = NULL;
  cocktailMenu[0].prev = &cocktailMenu[2];
  cocktailMenu[0].next = &cocktailMenu[1];
  cocktailMenu[0].glassSz = 0;
  cocktailMenu[0].drink = &longIslandIcedTea;
  strcpy(cocktailMenu[0].line1, "Long Island");
  strcpy(cocktailMenu[0].line2, " Iced Tea");

  // Vodka-O
  cocktailMenu[1].parMenu = tlMenu;
  cocktailMenu[1].subMenu = NULL;
  cocktailMenu[1].prev = &cocktailMenu[0];
  cocktailMenu[1].next = &cocktailMenu[2];
  cocktailMenu[1].glassSz = 0;
  cocktailMenu[1].drink = &vodkaO;
  strcpy(cocktailMenu[1].line1, "Vodka +");
  strcpy(cocktailMenu[1].line2, " Orangensaft");

  // Vodka-Cola
  cocktailMenu[2].parMenu = tlMenu;
  cocktailMenu[2].subMenu = NULL;
  cocktailMenu[2].prev = &cocktailMenu[1];
  cocktailMenu[2].next = &cocktailMenu[0];
  cocktailMenu[2].glassSz = 0;
  cocktailMenu[2].drink = &vodkaCola;
  strcpy(cocktailMenu[2].line1, "Vodka +");
  strcpy(cocktailMenu[2].line2, " Cola");

  /*
  *  Impressum
  */
  imprint[0].parMenu = tlMenu;
  imprint[0].subMenu = NULL;
  imprint[0].prev = imprint;
  imprint[0].next = imprint;
  imprint[0].glassSz = 0;
  imprint[0].drink = NULL;
  strcpy(imprint[0].line1, "Harald Weing");
  strcpy(imprint[0].line2, "Matthias Weing");

  /*
  *  Hauptmenue
  */
  // Glasgroesse
  tlMenu[0].parMenu = NULL;
  tlMenu[0].subMenu = glassSizeMenu;
  tlMenu[0].prev = &tlMenu[2];
  tlMenu[0].next = &tlMenu[1];
  tlMenu[0].glassSz = 0;
  tlMenu[0].drink = NULL;
  strcpy(tlMenu[0].line1, "Glasgroesse");
  strcpy(tlMenu[0].line2, "einstellen");

  // Cocktails
  tlMenu[1].parMenu = NULL;
  tlMenu[1].subMenu = cocktailMenu;
  tlMenu[1].prev = &tlMenu[0];
  tlMenu[1].next = &tlMenu[2];
  tlMenu[1].glassSz = 0;
  tlMenu[1].drink = NULL;
  strcpy(tlMenu[1].line1, "Cocktail");
  strcpy(tlMenu[1].line2, "waehlen");

  // Impressum
  tlMenu[2].parMenu = NULL;
  tlMenu[2].subMenu = imprint;
  tlMenu[2].prev = &tlMenu[1];
  tlMenu[2].next = &tlMenu[0];
  tlMenu[2].glassSz = 0;
  tlMenu[2].drink = NULL;
  strcpy(tlMenu[2].line1, "Impressum");
  strcpy(tlMenu[2].line2, "anzeigen");

  return tlMenu;
}


/*
*  Methode zum mischen der Cocktails
*  schreibt Mischungen auf entsprechende Ports, oeffnet und schliesst 
also die Ventile
*
*  Ablauf:
*    (1) Pressluft auf, Entlueftung auf, Belueftung zu
*    (2) Zutaten reinlaufen lassen - jede Kammer hat 2cl 
Fassungsvermoegen!
*    (3) Pressluft zu, Entlueftung zu, Belueftung auf (laesst Zutaten 
von Mischer in Glas laufen)
*    (4) Falls noch mehr Zutaten von einer Sorte (> 2cl), weiter bei (1)
*    (5) Pressluft auf, Entlueftung zu, Belueftung zu (fertig mit 
Mischen)
*/
void mixDrink(cocktail *drink) {
  // letzte verwendete Cola-Zufuhr (fuer moeglichst gleichmaeßigen 
Verbrauch)
  // 0 = Cola1, 1 = Cola2, 2 = Cola3
  static uint8_t lastCoke = 0;

  // drink kopieren
  uint8_t gin = drink->gin;        // Gin
  uint8_t rum = drink->rum;        // Rum
  uint8_t vodka = drink->vodka;      // Vodka
  uint8_t tequila = drink->tequila;    // Tequila
  uint8_t zitrone = drink->zitrone;    // Zitronensaft
  uint8_t orange = drink->orange;      // Orangensaft
  uint8_t tripleSec = drink->tripleSec;  // TripleSec
  uint8_t cola = drink->cola;        // Cola

  // temporaere Masken fuer Ventile, damit Schnaepse gleichzeitig 
loslaufen koennen
  uint8_t vent1;
  uint8_t vent2;


  while ((gin > 0) | (rum > 0) | (vodka > 0) | (tequila > 0) | (zitrone 
> 0) | (orange > 0) | (tripleSec > 0) | (cola > 0)) {
    // temporare Masken zuruecksetzen
    vent1 = 0;
    vent2 = 0;

    // noch nicht fertig gemixt
    // pressluft auf, entlueftung auf, belueftung zu
    vent2 = blast | vent;
    vent2 &= ~aeration;
    Vent2Port |= vent2;

    // vent2 zuruecksetzen
    vent2 = 0;

    // Ventilen Zeit geben, um zu schalten
    _delay_ms(pufferTime);

    // Zutaten reinlaufen lassen, pro Intervall skaliert ueber 
Glasgroesse "2cl"
    // Restrgroessen gleich mit anpassen
    if (gin) {
      vent1 |= Gin;
      gin -= 2;
    }
    if (rum) {
      vent1 |= Rum;
      rum -= 2;
    }
    if (vodka) {
      vent1 |= Vodka;
      vodka -= 2;
    }
    if (tequila) {
      vent1 |= Tequila;
      tequila -= 2;
    }
    if (zitrone) {
      vent1 |= Zitronensaft;
      zitrone -= 2;
    }
    if (orange) {
      vent1 |= Orangensaft;
      orange -= 2;
    }
    if (tripleSec) {
      vent1 |= TripleSec;
      tripleSec -= 2;
    }

    // Spzialfall Cola
    if (cola >= 6) {
      // alle drei Behaelter laufen lassen
      vent1 |= Cola1;
      vent2 |= Cola2 | Cola3;

      cola -= 6;
    } else if (cola >= 4) {
      // die beiden zuletzt nicht benutzen Cola-Behaelter laufen lassen
      if (lastCoke == 0) {
        vent2 |= Cola2 | Cola3;
      } else if (lastCoke == 1) {
        vent1 |= Cola1;
        vent2 |= Cola3;
      } else {
        vent1 |= Cola1;
        vent2 |= Cola2;
      }

      cola -= 4;

      // letzen verwendeten Behaelter anpassen
      lastCoke++;
      lastCoke %= 3;
    } else {
      // naechsten nicht benutzen Cola-Behaelter laufen lassen
      if (lastCoke == 0) {
        vent2 |= Cola2;
      } else if (lastCoke == 1) {
        vent2 |= Cola3;
      } else {
        vent1 |= Cola1;
      }

      cola -= 2;

      // letzten verwendeten Behaelter anpassen
      lastCoke++;
      lastCoke %= 3;
    }

    // Ventile oeffnen -> in Mischbehaelter laufen lassen
    Vent1Port = vent1;
    Vent2Port |= vent2;

    // warten, bis Schnaps durchgelaufen ist
    _delay_ms(runTime / glassSize);

    // Ventile schliessen -> Schnaps in Mischbehaelter
    Vent1Port = 0;
    Vent2Port &= ~vent2;

    // Ventile schliessen lassen
    _delay_ms(pufferTime);

    // vent2 zureucksetzen
    vent2 = 0;

    // Mischbehaelter nach unten oeffnen -> Gemisch in Glas
    Vent2Port = aeration;

    // Zeit geben zum durchlaufen lassen
    _delay_ms(5 * runTime);
  }

  // Anfangszustand wiederherstellen (Nur Pressluft offen)
  Vent2Port = blast;

  // Ventile schalten lassen
  _delay_ms(pufferTime);
}


/*
*  main-Methode
*/
int main(void) {
  // Richtungsregister fuer Taster setzen (alle Pins als Eingang)
  NavigationDirection = 0;

  // Eventuell aktive Pull-Up-Widerstaende ausschalten
  NavigationPort = 0;

  // Richtungsregister fuer Ventile setzen
  Vent1Direction = Gin | Rum | Vodka | Tequila | Zitronensaft | 
Orangensaft | TripleSec | Cola1;
  Vent2Direction = Cola2 | Cola3 | blast | aeration | vent;

  // alle Ventile zu machen
  Vent1Port = 0;
  Vent2Port = blast; // Pressluft muss am Anfang anliegen



  // Menue initialisieren - aktueller Menue-Eintrag
  struct menuPoint *current = initMenu();


  // Initialisierung des LCD
  // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze 
Balken
  // verschwunden sein
  lcd_init();


  // Text des ersten Mneu-Eintrags auf Display schreiben
  lcd_string(current->line1);
  lcd_setcursor(0,2);
  lcd_string(current->line2);


  // wenn navigiert wurde, dann Display neu beschreiben lassen
  uint8_t redraw = 0;
  while(1) {
    if (debounce_Down()) {
      // einen Menuepunkt nach unten
      current = current->next;
      redraw++;
    } else if (debounce_Up()) {
      // einen Menuepunkt nach oben
      current = current->prev;
      redraw++;
    } else if (debounce_Enter()) {
      // Eintrag waehlen / in Menue absteigen
      if (current->subMenu) {
        // Untermenue existiert -> absteigen
        current = current->subMenu;
        redraw++;
      } else {
        // auf jeden fall kein Untermenue -> Aktion feststellen
        if (current->glassSz) {
          // ist Glassgroesse aendern -> mach das
          glassSize = current->glassSz;
          // zurueck zu uebergeordnetem Menue
          current = current->parMenu;
          redraw++;
        } else {
          // kein Glassgroessen-Eintrag
          if (current->drink) {
            // ist Cocktail-Eintrag -> Cocktail mischen
            mixDrink(current->drink);
            // zurueck zu uebergeordnetem Menue
            current = current->parMenu;
            redraw++;
          } else {
            // Impressum-Eintrag -> zurueck zu uebergeordnetem Menu
            current = current->parMenu;
            redraw++;
          }
        }
      }
    } else if (debounce_Back()){
      // eine Menue-Ebene nach oben / zurueck, falls nicht schon ganz 
oben
      if (current->parMenu) {
        // ist nicht Top-Level-Eintrag
        current = current->parMenu;
      }
      // sonst: nix machen
    } else if (debounce_Reset()) {
      // wird hardwareseitig gemacht
    } else {
      // leere Anweisung, kein Event
      ;
    }

    if (redraw) {
      // aktueller Menue-Eintrag (current) veraendert -> Display neu 
beschreiben
      lcd_clear();
      lcd_setcursor(0,1);
      lcd_string(current->line1);
      lcd_setcursor(0,2);
      lcd_string(current->line2);

      // redraw wieder auf 0 setzen, wenn nix veraendert wird, nix 
zeichnen
      redraw = 0;
    }
   }

  return 0;
}

von ICH (Gast)


Lesenswert?

Floh schrieb:
> ICH schrieb:
>> 4 Schalter
>
> wie verschaltet?

Von +5 V auf über den Taster auf den Pin.
Entprellt werden sie im µC

von Falk B. (falk)


Lesenswert?

@ ICH (Gast)

Lies mal was über Netiquette! Lange Quelltexte gehören in den 
Anhang!

von Lars (Gast)


Lesenswert?

ICH schrieb:
>Von +5 V auf über den Taster auf den Pin.
>Entprellt werden sie im µC

Fehlender Pull-Down Widerstand an den Pins?! Wenn die keinen definierten 
Pegel haben könnten sie schalten wie sie lustig sind

von ahnungslos (Gast)


Lesenswert?

>Jetzt habe ich nur das Problem, dass der Mega 32 durch das ganze
>Programm springt

Das ist sein Job!

von Kevin (Gast)


Lesenswert?

Du machst aus 12 Volt --> +5V(7805) & -5V(7905)?
Vielleicht hast du ein Masseproblem, Schaltplan könnte helfen.

von Pete K. (pete77)


Lesenswert?

Im Code ist F_CPU auf 8Mhz gesetzt, im Eingangspost schreibst Du etwas 
von 16 Mhz.

Mach mal weniger Defines. Die kann der Compiler nicht prüfen. Bekommst 
Du Warnungen beim Compilieren?

Das Debounce sieht etwas merkwürdig aus...

Abblockkondensatoren verwendet?

von Kevin (Gast)


Lesenswert?

Ach noch etwas, 16.000 Mhz sind etwas zuviel. 16 Mhz würden reichen, 
außerdem steht im Programm etwas von 8 Mhz. ;-)

von ICH (Gast)


Lesenswert?

Kevin schrieb:
> Du machst aus 12 Volt --> +5V(7805) & -5V(7905)?
> Vielleicht hast du ein Masseproblem, Schaltplan könnte helfen.

Nein, ich mache nur +5 V
ich habe nirgendwo ein negative Potential.

von ICH (Gast)


Lesenswert?

Pete K. schrieb:
> Im Code ist F_CPU auf 8Mhz gesetzt, im Eingangspost schreibst Du etwas
> von 16 Mhz.
>
> Mach mal weniger Defines. Die kann der Compiler nicht prüfen. Bekommst
> Du Warnungen beim Compilieren?
>
> Das Debounce sieht etwas merkwürdig aus...
>
> Abblockkondensatoren verwendet?

Das mit den 16Mhz steht jetzt auch im Code.
Wohin müssen die Abblockkondensatoren?
vor den Pin des Schalters?

von Peter D. (peda)


Lesenswert?

ICH schrieb:
> Ich habe auch schon die Pins umgebogen, damit sie nicht mehr im Sockel
> sind.

Und wie soll dann der Pegel für "nicht gedrückt" ankommen???

Ein Pin nur als Antenne beschaltet, kann beliebigen Pegel haben.


Peter

von J.-u. G. (juwe)


Lesenswert?

ICH schrieb:
> Jetzt habe ich nur das Problem, dass der Mega 32 durch das ganze
> Programm springt,

Kannst Du das näher beschreiben?

ICH schrieb:
> obwohl er kein Signal von einem Taster bekommt.

Doch. Bei fehlenden Pulldown Widerständen können, wie bereits von Lars 
angemerkt, sehr wohl "Tastendrücke" erkannt werden, auch wenn kein 
Taster betätigt wird.

von ICH (Gast)


Lesenswert?

J.-u. G. schrieb:
>> Jetzt habe ich nur das Problem, dass der Mega 32 durch das ganze
>> Programm springt,
>
> Kannst Du das näher beschreiben?

Ich lege Spannung an, und kann am LCD zuschauen, wie er schön durch das 
Menü springt und dann sich einen Menüpunkt aussucht und dann dort stehen 
bleibt.

von Peter D. (peda)


Lesenswert?

Frag Dich einfach mal, warum die meisten den internen Pullup einschalten 
und den Taster gegen GND.


Peter

von ICH (Gast)


Lesenswert?

Ist es entsceident, ob ich 10kOhm oder 8 kOhm als Pulldown verwende?
Als Abblockkondensator sind 100V 100µF ausreichend?

von Chris (Gast)


Lesenswert?

10k oder 8k ist egal.
100uF ist zu groß 100nF ist da eher ein vernüftiger Wert

von ICH (Gast)


Lesenswert?

Es sind 12 pF verbaut, beim Quarz, ist das extrem schlimm, wenn da keine 
22 pF dran hängen?

von J.-u. G. (juwe)


Lesenswert?

ICH schrieb:
> Es sind 12 pF verbaut, beim Quarz, ist das extrem schlimm, wenn da keine
> 22 pF dran hängen?

2 x 12pF am Quartz sind auch in Ordnung.

von ICH (Gast)


Lesenswert?

Hey, nachdem ich Pull-Down Widerstände und Abblock Kerko eingebuat habe 
funktioniert es jetzt
sehr schön.


Vielen Dank an eure schnelle und gute Hilfe.


Ich melde mich, wenn es weiter Probleme gibt.

Gruß

von Pete K. (pete77)


Lesenswert?

Allgemein hilft es, sich bei der Beschaltung eng an die Datenblätter zu 
halten. Das ist manchmal etwas mühsam und löst auch nicht alle Probleme, 
aber 90% der Fehler kann man da wahrscheinlich mit erschlagen.

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.