Forum: Compiler & IDEs Interner Pullup Widerstand, Buttonansteuerung klappt nicht


von patrick b. (calalex)


Lesenswert?

Hallo, ich hab einen Atmel8-16 und steuere damit schon ein LCD Display, 
das klappt wunderbar. Nun habe ich an den PORTB PB0 einen Schalter 
direkt auf Masse gelegt, sofern ich den drücke würd ich gern eine 
vorgegebe Zeile im LCD Display sehen.

Dazu habe ich im header den Button so deklariert:

#define BUTTON_PORT PORTB       /* PORTx - register for button output */
#define BUTTON_PIN PINB         /* PINx - register for button input */
#define BUTTON_BIT PB0          /* bit for button input/output */


Im mainfile habe ich dann den Port so schalten wollen, dass der interne 
Pullup Widerstand aktiv ist und sofern man den Button drückt, soll durch 
die While Schleife der neue Befehl zum Senden an das Display geschickt 
werden.. leider klappt hier aber irgendwas noch nicht. Würde mich über 
Feedback sehr freuen!

#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#include "lcd-routines.h"
#include <util/delay.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>


int main(void)
{

  lcd_init();
  set_cursor( 0, 1 );
  lcd_start();

  //init_io();

  //DDRB = 0b00000111; //set B0, B1 and B2 as output
  //DDRB = ( 1 << PB2 );
  // DDRB = ( 1 << PB1 );

 //PINB &= ~(1<<PB0); //set PB0 to input
 //PORTB |= (1<<PB0); //enable pullup on input
  PORTB=0xFE;
  PINB=0xFF;

  while(1==1)
  {

     if(!(PB0 & 0x01))
     {
      while(!(PB0 & 0x01));
      _delay_ms(500);
      lcd_init();
      //lcd_clear();
      set_cursor(0,2);
      lcd_string("YEAH");

    }


  }


  return 0;
}

von Dummschwaetzer (Gast)


Lesenswert?

entprellen

von Dummschwaetzer (Gast)


Lesenswert?

> PB0 & 0x01
macht nicht das was du denkst
Input-Register von PortB mit 0x01 vergleichen

von patrick b. (calalex)


Lesenswert?

ich hab ein _delay_ms von 50 bis 500 ausprobiert.. hat aber auch nichts 
gebracht..

von patrick b. (calalex)


Lesenswert?

ich habs jetzt so verbessert, aber auch noch keine Reaktion auf einen 
tastendruck..


int main(void)
{

  lcd_init();

  PORTB=0xFE;
  PINB=0xFF;

  while(1==1)
  {

     if(!(PINB & 0x01))
     { _delay_ms(50);
      while(!(PINB & 0x01));
      _delay_ms(50);
      lcd_init();
      //lcd_clear();
      set_cursor(0,2);
      lcd_string("YEAH");

    }


  }



  return 0;
}

von Dummschwaetzer (Gast)


Lesenswert?

probiere mal if((PINB & 0x01)==0x00)

von Malte S. (maltest)


Lesenswert?

patrick bateman schrieb:
> if(!(PB0 & 0x01))

Irgendwo in den Headern (avr/iom8.h) findest Du:
#define PB0 0
PB0 ist also ein Alias für Bit nummer 0

if (!(0 & 0x01))

Die Bedingung ist niemals erfüllt.
Du meinst

if (!(PINB & (1 << PB0)))

von Karl H. (kbuchegg)


Lesenswert?

1
  PORTB=0xFE;
2
  PINB=0xFF;
3
4
  while(1==1)
5
  {
6
7
     if(!(PINB & 0x01))


1
  PORTB=0xFE;
Du hast dir an diesem Port ALLE Pullup-Widerstände eingeschaltet AUSSER 
genau den einen den du brauchen würdest.

Schreib doch die Dinge so
1
  PORTB |= (1<<PB0);    // 1-Bit im Port-Register --> Pullup ein, weil
2
                        // der Pin auf Eingang geschaltet ist und der Taster
3
                        // nach GND durchschaltet
4
5
  while(1==1)
6
  {
7
8
     if(!(PINB & (1<<PB0)))

dann passieren dir auch keine blödsinnigen Fehler in den 
Bitdarstellungen.

von Karl H. (kbuchegg)


Lesenswert?

1
     if(!(PINB & 0x01))
2
     { _delay_ms(50);
3
      while(!(PINB & 0x01));
4
      _delay_ms(50);
5
      lcd_init();
6
      //lcd_clear();
7
      set_cursor(0,2);
8
      lcd_string("YEAH");
9
10
    }

das lcd_init() hat da drinn nichts verloren.

'Initialisieren' bedeutet 'etwas in den Grundzustand bringen'.
Initalisiert wird daher am Programmanfang. Und zwar einmalig.
(Es gibt Ausnahmen, aber da muss man schon wissen, was man tut)

Der Grundaufbau ist immer
1
int main()
2
{
3
4
  alle Initialisierungen
5
6
  sei();  // wenn Interrupts gebraucht werden
7
8
  while( 1 )
9
  {
10
11
     eigentliche Programmlogik
12
13
  }
14
}

von patrick b. (calalex)


Lesenswert?

danke für eure Kommentare. hab alles ausprobiert, leider noch Lösung,

hier mein angepasster Code:
#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#include "lcd-routines.h"
#include <util/delay.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>


int main(void)
{

  lcd_init();
  set_cursor( 0, 1 );
  lcd_start();

 PINB=0xFF;
  PORTB = (1<<PB0);

  while(1==1)
  {
    if(!(PINB & (1<<PB0)))
     {
      _delay_ms(50);
      while(!(PINB & 0x01));
      set_cursor(0,1);
      lcd_string("YEAH");
    }

  }

  return 0;
}

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

patrick bateman schrieb:
> danke für eure Kommentare. hab alles ausprobiert, leider noch Lösung,

Was heist denn "leider noch Lösung"?

Dass es immer noch flackert, wenn Du die Taste ein zweites Mal drückst?

Und was bezweckt dieses:
1
 PINB=0xFF;

(Die Sache mit der Entprellung lassen wir jetzt mal außen vor)

von patrick b. (calalex)


Lesenswert?

leider noch keine Lösung sollte das heißen. Bei Tastendruck verändert 
sich das LCD noch nicht.

von patrick b. (calalex)


Lesenswert?

PINB=0xFF; damit wollte ich den PINB als input definieren, dann sollte 
es aber richtig so sein PINB=0xFF; oder?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

patrick bateman schrieb:
> PINB=0xFF; damit wollte ich den PINB als input definieren, dann sollte
> es aber richtig so sein PINB=0xFF; oder?

Du verwechselst gerade PINB mit DDRB. Letzteres bestimmt die Richtung.

Bit gesetzt: Output
Bit gelöscht: Input

Du hast aber Glück. Nach dem Reset ist DDRB = 0, somit sind alle Pins am 
Port auf Input. Sag mal... wo hängt überhaupt Dein LCD dran? Und wofür 
setzt Du vor dem while() den Cursor? Was macht lcd_start()? Ich kenne 
Deine LCD-Routinen nicht. Wo hast Du die her?

Funktioniert denn ein zusätzliches(!)

 lcd_string("YUPP");

vor der while-Schleife?

von patrick b. (calalex)


Angehängte Dateien:

Lesenswert?

ja das LCD funktioniert auch vor der while-Schleife.

also hier lcd-routines.c
______________________________________________________________________ 
__
#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>
#include <inttypes.h>
#include <avr/sfr_defs.h>

void init_io()
{
  /* set LED pin as digital output */
  LED_DDR =_BV(LED_BIT);

  /* led is OFF initially (set pin high) */
  LED_PORT |= _BV(LED_BIT);
  /* turn on internal pull-up resistor for the switch */
  BUTTON_PIN  &= ~_BV(BUTTON_PIN);
  BUTTON_PORT |= _BV(BUTTON_BIT);
}

int button_is_pressed()
{
  /* the button is pressed when BUTTON_BIT is clear */
  if (bit_is_clear(BUTTON_PIN, BUTTON_BIT))
  {
    _delay_ms(25);
    if (bit_is_clear(BUTTON_PIN, BUTTON_BIT)) return 1;
  }

  return 0;
}





// sendet ein Datenbyte an das LCD

void lcd_data(unsigned char temp1)
{
  unsigned char temp2 = temp1;

  LCD_RS_PORT |= (1<<LCD_RS);        // RS auf 1 setzen

  temp1 = temp1 >> 4;
  temp1 = temp1 & 0x0F;

  LCD_PORT_4 &= ~(1<<LCD_D4);
  LCD_PORT_5 &= ~(1<<LCD_D5);
  LCD_PORT_6 &= ~(1<<LCD_D6);
  LCD_PORT_7 &= ~(1<<LCD_D7);

  if(temp1 & 0x01) LCD_PORT_4 |=(1<<LCD_D4) ;// setzen
  if(temp1 & 0x02) LCD_PORT_5 |=(1<<LCD_D5) ;
  if(temp1 & 0x04) LCD_PORT_6 |=(1<<LCD_D6) ;
  if(temp1 & 0x08) LCD_PORT_7 |=(1<<LCD_D7) ;
  lcd_enable();



  temp2 = temp2 & 0x0F;

  LCD_PORT_4 &= ~(1<<LCD_D4);
  LCD_PORT_5 &= ~(1<<LCD_D5);
  LCD_PORT_6 &= ~(1<<LCD_D6);
  LCD_PORT_7 &= ~(1<<LCD_D7);

  if(temp2 & 0x01) LCD_PORT_4 |=(1<<LCD_D4) ;// setzen
  if(temp2 & 0x02) LCD_PORT_5 |=(1<<LCD_D5) ;
  if(temp2 & 0x04) LCD_PORT_6 |=(1<<LCD_D6) ;
  if(temp2 & 0x08) LCD_PORT_7 |=(1<<LCD_D7) ;
  lcd_enable();


  _delay_us(420);
}

// sendet einen Befehl an das LCD

void lcd_command(unsigned char temp1)
{
  unsigned char temp2 = temp1;

  LCD_RS_PORT &= ~(1<<LCD_RS);        // RS auf 0 setzen

  temp1 = temp1 >> 4;              // oberes Nibble holen
  temp1 = temp1 & 0x0F;

  LCD_PORT_4 &= ~(1<<LCD_D4);
  LCD_PORT_5 &= ~(1<<LCD_D5);
  LCD_PORT_6 &= ~(1<<LCD_D6);
  LCD_PORT_7 &= ~(1<<LCD_D7);            // maskieren

  if(temp1 & 0x01) LCD_PORT_4 |=(1<<LCD_D4) ;// setzen
  if(temp1 & 0x02) LCD_PORT_5 |=(1<<LCD_D5) ;
  if(temp1 & 0x04) LCD_PORT_6 |=(1<<LCD_D6) ;
  if(temp1 & 0x08) LCD_PORT_7 |=(1<<LCD_D7) ;
  lcd_enable();

  temp2 = temp2 & 0x0F;

  LCD_PORT_4 &= ~(1<<LCD_D4);
  LCD_PORT_5 &= ~(1<<LCD_D5);
  LCD_PORT_6 &= ~(1<<LCD_D6);
  LCD_PORT_7 &= ~(1<<LCD_D7);        // unteres Nibble holen und 
maskieren

  if(temp2 & 0x01) LCD_PORT_4 |=(1<<LCD_D4) ;// setzen
  if(temp2 & 0x02) LCD_PORT_5 |=(1<<LCD_D5) ;
  if(temp2 & 0x04) LCD_PORT_6 |=(1<<LCD_D6) ;
  if(temp2 & 0x08) LCD_PORT_7 |=(1<<LCD_D7) ;
  lcd_enable();

  _delay_us(420);
}

// erzeugt den Enable-Puls

void lcd_enable(void)
{
  // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
einfügen
     _delay_us(100);
  // Beitrag "Re: Bitte helft mir. Schon wieder AtMega16"
  LCD_EN1_PORT |= (1<<LCD_EN1);


  _delay_us(100);                   // kurze Pause
  // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
verlängern
  // Beitrag "LCD -> Probleme mit Optimierungsgrad"
  LCD_EN1_PORT &= ~(1<<LCD_EN1);



}
// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.

void lcd_init(void)
{
  //_delay_ms(150);

  // Ports auf Ausgang schalten
  LCD_DDR_4 |=(1<<LCD_D4);
  LCD_DDR_5 |=(1<<LCD_D5);
  LCD_DDR_6 |=(1<<LCD_D6);
  LCD_DDR_7 |=(1<<LCD_D7);
  LCD_EN1_DDR |= (1<<LCD_EN1);
  LCD_RS_DDR  |= (1<<LCD_RS);
  LCD_RW_DDR |=(1<<LCD_RW);

  // muss 3mal hintereinander gesendet werden zur Initialisierung

  _delay_ms(150);

  LCD_PORT_4 |=  (1<<LCD_D4);
  LCD_PORT_5 |=  (1<<LCD_D5);
  LCD_PORT_6 &= ~(1<<LCD_D6);
  LCD_PORT_7 &= ~(1<<LCD_D7);
  LCD_RS_PORT &= ~(1<<LCD_RS);      // RS auf 0
  LCD_RW_PORT &= ~(1<<LCD_RW);
  _delay_ms(50);
  lcd_enable();

  _delay_ms(50);
  lcd_enable();

  _delay_ms(50);
  lcd_enable();

  _delay_ms(50);

  // 4 Bit Modus aktivieren

  LCD_PORT_4 &=  ~(1<<LCD_D4);
  LCD_PORT_5 |=   (1<<LCD_D5);
  LCD_PORT_6 &=  ~(1<<LCD_D6);
  LCD_PORT_7 &=  ~(1<<LCD_D7);

  lcd_enable();
  _delay_ms(1);

  // 4Bit  2 Zeilen  5x7
  lcd_command(0x28);

  // Display ein  Cursor aus  kein Blinken
  lcd_command(0x0C);

  // inkrement / kein Scrollen
  lcd_command(0x06);

  lcd_clear();
}

// Sendet den Befehl zur Löschung des Displays

void lcd_clear(void)
{
  lcd_command(CLEAR_DISPLAY);
  _delay_ms(50);
}

// Sendet den Befehl: Cursor Home

void lcd_home(void)
{
  lcd_command(CURSOR_HOME);
  _delay_ms(5);
}

// setzt den Cursor in Zeile y (1..4) Spalte x (0..15)

void set_cursor(uint8_t x, uint8_t y)
{
  uint8_t tmp;

  switch (y) {
    case 1: tmp=0x80+0x00+x;  break;    // 1. Zeile
    case 2: tmp=0x80+0x40+x;  break;    // 2. Zeile
  }
  lcd_command(tmp);
}

// Schreibt einen String auf das LCD

void lcd_string( const char *data )
{
  while( *data != '\0' )
  lcd_data( *data++ );
}

void lcd_start(void)
{
  lcd_string("Status:");
  set_cursor(0,2);
  lcd_string("online");
}

______________________________________________________________________ 
_

lcd-routines.h
______________________________________________________________________ 
_

#ifndef LCD_ROUTINES_H
#define LCD_ROUTINES_H

void lcd_string( const char *data );
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x, uint8_t y);


// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#ifndef F_CPU
#define F_CPU 4000000
#endif

// LCD Befehle

#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME   0x02

// Pinbelegung für das LCD, an verwendete Pins anpassen

#define LCD_PORT_4    PORTC
#define LCD_DDR_4     DDRC
#define LCD_D4      PC0

#define LCD_PORT_5    PORTC
#define LCD_DDR_5     DDRC
#define LCD_D5    PC1

#define LCD_PORT_6    PORTC
#define LCD_DDR_6     DDRC
#define LCD_D6      PC2

#define LCD_PORT_7    PORTC
#define LCD_DDR_7     DDRC
#define LCD_D7    PC3

#define LCD_RS_PORT   PORTB
#define LCD_RS_DDR    DDRB
#define LCD_RS        PB3

#define LCD_EN1_PORT  PORTB
#define LCD_EN1_DDR   DDRB
#define LCD_EN1       PB5

#define LCD_RW_PORT   PORTB
#define LCD_RW_DDR    DDRB
#define LCD_RW        PB4

#define BUTTON_PORT PORTB       /* PORTx - register for button output */
#define BUTTON_PIN PINB         /* PINx - register for button input */
#define BUTTON_BIT PB0          /* bit for button input/output */

#define LED_PORT PORTB          /* PORTx - register for LED output */
#define LED_BIT PB1             /* bit for button input/output */
#define LED_DDR DDRB            /* LED data direction register */

#define DEBOUNCE_TIME 25        /* time to wait while "de-bouncing" 
button */
#define LOCK_INPUT_TIME 250     /* time to wait after a button press */

#define LCD_BOOTUP_MS           15
#define LCD_ENABLE_US           20
#define LCD_WRITEDATA_US        46
#define LCD_COMMAND_US          42

#define LCD_SOFT_RESET_MS1      5
#define LCD_SOFT_RESET_MS2      1
#define LCD_SOFT_RESET_MS3      1
#define LCD_SET_4BITMODE_MS     5

#define LCD_CLEAR_DISPLAY_MS    2
#define LCD_CURSOR_HOME_MS      2

#define LCD_DDADR_LINE1         0x00
#define LCD_DDADR_LINE2         0x40



// Set Entry Mode ------------- 0b000001xx
#define LCD_SET_ENTRY           0x04

#define LCD_ENTRY_DECREASE      0x00
#define LCD_ENTRY_INCREASE      0x02
#define LCD_ENTRY_NOSHIFT       0x00
#define LCD_ENTRY_SHIFT         0x01

// Set Display ---------------- 0b00001xxx
#define LCD_SET_DISPLAY         0x08

#define LCD_DISPLAY_OFF         0x00
#define LCD_DISPLAY_ON          0x04
#define LCD_CURSOR_OFF          0x00
#define LCD_CURSOR_ON           0x02
#define LCD_BLINKING_OFF        0x00
#define LCD_BLINKING_ON         0x01

// Set Shift ------------------ 0b0001xxxx
#define LCD_SET_SHIFT           0x10

#define LCD_CURSOR_MOVE         0x00
#define LCD_DISPLAY_SHIFT       0x08
#define LCD_SHIFT_LEFT          0x00
#define LCD_SHIFT_RIGHT         0x04

// Set Function --------------- 0b001xxxxx
#define LCD_SET_FUNCTION        0x20

#define LCD_FUNCTION_4BIT       0x00
#define LCD_FUNCTION_8BIT       0x10
#define LCD_FUNCTION_1LINE      0x00
#define LCD_FUNCTION_2LINE      0x08
#define LCD_FUNCTION_5X7        0x00
#define LCD_FUNCTION_5X10       0x04

#define LCD_SOFT_RESET          0x30

// Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)
#define LCD_SET_CGADR           0x40

#define LCD_GC_CHAR0            0
#define LCD_GC_CHAR1            1
#define LCD_GC_CHAR2            2
#define LCD_GC_CHAR3            3
#define LCD_GC_CHAR4            4
#define LCD_GC_CHAR5            5
#define LCD_GC_CHAR6            6
#define LCD_GC_CHAR7            7

// Set DD RAM Address --------- 0b1xxxxxxx  (Display Data RAM)
#define LCD_SET_DDADR           0x80

#endif
______________________________________________________________________

den Widerstand am Schalter s2 hab ich durch einen 0ohm Widerstand 
ersetzt..

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

patrick bateman schrieb:
> ja das LCD funktioniert auch vor der while-Schleife.

Ach? Kaum zu glauben, Du sagst also, dass bei Einfügen der YUPP-Zeile 
unmittelbar vor dem while() tatsächlich YUPP auf dem Display erscheint?
1
 ....
2
  PINB=0xFF;
3
  PORTB = (1<<PB0);
4
5
  lcd_string("YUPP");
6
7
  while(1==1)
8
  {
9
    ....

Meines Erachtens macht bei Dir

  PORTB = (1<<PB0);

ziemlich viel kaputt, Da Du nämlich R/W, EN und RS auch am PORT B hängen 
hast! Was soll die Zeile überhaupt tun?

Schmeiß die Zeilen

  PINB=0xFF;
  PORTB = (1<<PB0);

raus, die sind absoluter Unsinn.

Und ändere

      while(!(PINB & 0x01));

in

      while(!(PINB & (1<<PB0)));

damit Du dann auch konsequent 1<<PB0 statt 0x01 verwendest.

Tja, so ist das halt, wenn man fremden Code zusammenkopiert und dann was 
drumherum strickt, ohne wirklich Ahnung von PORTB, PINB und DDRB zu 
haben...

Du solltest erstmal das C-Tutorial hier durcharbeiten und mit einer LED 
anfangen...

von Malte S. (maltest)


Lesenswert?

Frank M. schrieb:
> Schmeiß die Zeilen
>
>   PINB=0xFF;
>   PORTB = (1<<PB0);
>
> raus, die sind absoluter Unsinn.

Die erste ja, die dreht einmal alle Ausgänge um. Die zweite soll den im 
Pull-Up aktivierten und dass ist ja nicht ganz unsinnig. |= statt = wäre 
aber hilfreich.

von Karl H. (kbuchegg)


Lesenswert?

Dein Taster ist sicher am Pin 0 vom Port B angeschlossen?
1
int main(void)
2
{
3
  DDRB &= ~( 1<<PB0 );    // auf Eingang setzen (eigentlich unnötig, da er es schon ist)
4
  PORTB |= (1<<PB0);      // Pullup ein
5
6
  lcd_init();
7
  set_cursor( 0, 1 );
8
  lcd_start();
9
10
  while(1==1)
11
  {
12
    if( !(PINB & (1<<PB0)))   // Taste gedrückt
13
    {
14
      set_cursor(0,1);        //  Ja:   ->
15
      lcd_string("YEAH");
16
    }
17
    else
18
    {
19
      set_cursor(0,1);        //  Nein: ->
20
      lcd_string("Toll");
21
    }
22
  }
23
24
  return 0;
25
}

vielleicht ist ja auch das dein Problem, dass du irgendwie erwartest, 
dass sich der Text auch mal ändert. Tut er bei dir natürlich nicht, weil 
du ja nicht programmiert hast, was passieren soll, wenn der Taster nicht 
gedrückt ist.

von Karl H. (kbuchegg)


Lesenswert?

Ja, das ist immer ganz wichtig
1
void lcd_start(void)
2
{
3
  lcd_string("Status:");
4
  set_cursor(0,2);
5
  lcd_string("online");
6
}


Auch wenn nichts im Programm funktioniert. Eine 'System hochgefahren' - 
"Copyright by Anfänger" Meldung ist immer ganz wichtig :-)

von patrick b. (calalex)


Lesenswert?

:D

von patrick b. (calalex)


Lesenswert?

Die If Schleif wird so immer noch nicht ausgeführt. Aber dafür steht 
Toll auf dem LCD...

von Malte S. (maltest)


Lesenswert?

Was für einen Pegel misst du an PB0 wenn der Taster gedrückt ist?

von Karl H. (kbuchegg)


Lesenswert?

Was macht eigentlich der ganze Mist bei den LCD-Routinen
1
void init_io()
2
{
3
  /* set LED pin as digital output */
4
  LED_DDR =_BV(LED_BIT);
5
6
  /* led is OFF initially (set pin high) */
7
  LED_PORT |= _BV(LED_BIT);
8
  /* turn on internal pull-up resistor for the switch */
9
  BUTTON_PIN  &= ~_BV(BUTTON_PIN);
10
  BUTTON_PORT |= _BV(BUTTON_BIT);
11
}

Hat das irgendwas mit einem LCD zu tun?   Nein.
Besteht hier Potential, dass du wieder mal durch Zuweisung an einen 
kompletten Port alles durcheinander bringst.   Ja.


Verteil deine Funktionen nicht 'zufällig' irgendwie in den diversen 
Code-Files. Ein C-File namens lcd.c hat einen Themenkreis. Dieser 
Themenkreis lautet: LCD. Er lautet nicht: Buttons oder Leds.

Wenn du so weiter machst, wirst du nie den Überblock behalten, welcher 
Pin wo und wofür benutzt wird und noch viel wichtiger: wo er oder seine 
Einstellung verändert wird.
Warum nicht? Weil kein Mensch damit rechnet, dass du mitten im LCD-Code 
Code versteckst, der sich auch an anderen Pins zuschaffen macht, anstatt 
nur und ausschliesslich an den LCD Pins.
Sag schon: wo verstecken sich weitere DDR/Pin/Port Umschaltungen.

von Karl H. (kbuchegg)


Lesenswert?

patrick bateman schrieb:
> Die If Schleif wird so immer noch nicht ausgeführt.

Das wundert mich nicht.
So etwas wie eine If-'Schleife' existiert nicht.

Das Wesen einer Schleife besteht nun mal darin, dass etwas wiederholt 
wird. Drum heißt es Schleife. Weil es immer wieder im Kreis rum geht und 
wieder und wieder von vorne anfängt.

Ein if macht das aber nicht. Ein if trifft eine Auswahl aus 2 
Möglichkeiten. Das ist aber etwas ganz anderes als eine Schleife.

von patrick b. (calalex)


Lesenswert?

Malte S. schrieb:
> Was für einen Pegel misst du an PB0 wenn der Taster gedrückt ist?

0V in beiden Fällen..

von patrick b. (calalex)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hat das irgendwas mit einem LCD zu tun?   Nein.
> Besteht hier Potential, dass du wieder mal durch Zuweisung an einen
> kompletten Port alles durcheinander bringst.   Ja.

hab ich raus genommen, hat sich nichts durch verändert.

von patrick b. (calalex)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ein if macht das aber nicht. Ein if trifft eine Auswahl aus 2
> Möglichkeiten. Das ist aber etwas ganz anderes als eine Schleife.

du hast Recht, sorry.

von patrick b. (calalex)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn du so weiter machst, wirst du nie den Überblock behalten, welcher
> Pin wo und wofür benutzt wird und noch viel wichtiger: wo er oder seine
> Einstellung verändert wird

stimmt, hab an dieser Stelle schon viel gelernt und werd ich beim 
zweiten Layout berücksichtigen..

von J.-u. G. (juwe)


Lesenswert?

patrick bateman schrieb:
> 0V in beiden Fällen..

Was meinst Du mit "beiden Fällen"? Wenn der Taster nicht gedrückt ist, 
sollte Vcc an PB0 anliegen.

von patrick b. (calalex)


Lesenswert?

J.-u. G. schrieb:
> patrick bateman schrieb:
>> 0V in beiden Fällen..
>
> Was meinst Du mit "beiden Fällen"? Wenn der Taster nicht gedrückt ist,
> sollte Vcc an PB0 anliegen.

genau, da liegt wohl dann der Fehler..

von Malte S. (maltest)


Lesenswert?

Also ist der Pull-Up doch nicht an oder es gibt da nen Kurzschluss.
Was passiert, wenn du probehalber einen externen Pull-Up dazuschaltest?
Hast du evtl. zwei Kontakte vom Taster verbunden, die fest verbunden 
sind? Wie sieht es aus, wenn der gar nicht angeschlossen ist?

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.