Forum: Mikrocontroller und Digitale Elektronik Pinabfrage Problem Atmega8


von Max (Gast)


Lesenswert?

Hallo

habe einen Atmega8 mit 8MHZ. Drei Pins (PB1 bis PB3) sollen als digitale 
Eingänge dienen, diese Pins sollen je Programmdurchlauf mittels einer 
Funktion geprüft werden, ob sie high (+5v) oder low sind.
Der Funktionswert steuert später ein paar Ausgänge, PWM usw.

Ist Pin PB1 high soll der Wert der Funktion PosLK = 1 sein, ist PB2 high 
soll PosLK() = 2 sein usw.
Der Wert von PosLK wird dann mit UART an HTerm gesendet, das 
funktinoiert, aber der Rest will nicht so wirklich.
Benutzte AVR Studio 4, mit AVR Dude.

Hier der Code (paar Header zuviel, die sind für spätere Aufgaben)

********************************************************************
#include <avr/io.h>
#include <avr/interrupt.h>
#define  _AVR_ATmega8_  1  //Festlegung des µC Types
#define OSCSPEED  8000000 // CPU Speed mit 8 MHZ
#define F_CPU 8000000UL    // CPU Festlegung für delay Header
#include <util/delay.h>   //Einbindung von Warteschleifen
#include <stdint.h>
#include <stdlib.h>


void InitUART(uint32_t baud)  //die Funktion geht
{
  int baudrate=(OSCSPEED/(16*baud))-1;
  UBRRH = (unsigned char)(baudrate>>8);
  UBRRL = (unsigned char)baudrate;
  UCSRB = (1<<RXEN)|(1<<TXEN);
  UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
void UARTTransmit(unsigned char data) //die Funktion auch
{
  while (!( UCSRA & (1<<UDRE)) );
  UDR = data;
}



//Hier geht der Ärger los:
unsigned char PosLK(void) {
unsigned char Ort;
  if (bit_is_set(PINB,1))  //PIN B1 als Eingang
  {
    Ort = 1;

  }
      if (bit_is_set(PINB,2))  //PINB2 als Eingang
      {
      Ort = 2;
      }
        if (bit_is_set(PINB,3))  //PINB3 als Eingang
        {
        Ort = 3;
        }else{
        Ort = 0;}
        return Ort;
}

int main()//********************************************************
{
InitUART(9600);
DDRB &= ~(1<<PB1); // Pin PB1 als eingang
PORTB |= (1<<PB1); // PIN PB1 High Reading Eingang

DDRD &= ~(1<<PB2); // Pin PB2 als eingang
PORTD |= (1<<PB2); // PIN PB2 High Reading Eingang

DDRD &= ~(1<<PB3); // Pin PB3 als eingang
PORTD |= (1<<PB3); // PIN PB3 High Reading Eingang

while(1)//********************************************************
{

_delay_ms(1000);

UARTTransmit(PosLK());




//******************************************************************
}
return 0;}



Bin für jede Hilfe dankbar,
Gruß Max

von Max (Gast)


Lesenswert?

PORTD |= ...; soll natürlich PORTB |=... heißen  o.O

von Klaus W. (mfgkw)


Lesenswert?

Max schrieb:
> Bin für jede Hilfe dankbar,

Ok, dann:

- ein lesbarer und formatierter Quelltext würde die Freude am Verstehen 
erhöhen
- wo ist das Problem? Etwas geht und etwas nicht, aber was genau willst 
du nicht verraten?
- Was soll deine PosLK() liefern, wenn mehrere Bits gesetzt sind=

von B.A. (Gast)


Lesenswert?

UARTTransmit(PosLK() | 0x30);

von L. K. (ladde)


Lesenswert?

Ersetze in der PosLK-Funktion 2x if durch else if.
Zur Zeit hängt der Ruckgabewert ausschließlich davon ab, ob PINB3 
gesetzt ist.

von Max (Gast)


Lesenswert?

also ja klar das problem ist, dass meine PosLK() Funktion immer den 
gleichen
Rückgabewert liefert. Im Moment ist der Rückgabewert immer = 1.
 Zum Prüfen ob die Funktion läuft hänge ich +5V direkt an den einzelnen 
Pin.

habe die Funktion jetzt so geändert:

unsigned char PosLK(void)
{
  unsigned char Ort;
  if (bit_is_set(PINB,1))  //Wenn Pin PB1 hight ist, soll Ort = 1
  {
    Ort = 1;

  }
      else if (bit_is_set(PINB,2))  //PINB1 als LSM
      {
      Ort = 2;
      }
        else if (bit_is_set(PINB,3))  //PINB2
        {
        Ort = 3;
        }else{
        Ort = 0;}

        return Ort;
}


macht die Sache aber auch nicht besser -.-
Das gesendete Ergebniss mit UARTTransmit(PosLK() | 0x30); bzw. mit 
UARTTransmit(PosLK()); ist immer 1.

von Karl H. (kbuchegg)


Lesenswert?

Du hast die Pullups aktiviert!
D.h. die Pins liefern, wenn nichts drann hängt eine 1.
Das heißt aber auch, dein pin_is_set liefert immer TRUE.

Du musst die Pins mit Masse verbinden, nicht mit Vcc!
Und du musst das in deiner Auswahllogik auch berücksichtigen.

von Max (Gast)


Lesenswert?

jup stimmt, habe den Wald vor lauter Pins nicht mehr gesehen. 
Normalerweise hängt ein Sensor an den Eingangspins welcher "komplett 
beschaltet ist", da klappt das mit den +5Volt. Einfach vcc auf den Pin 
geben klappt natürlich nicht - war wohl zu faul das ganze sensorzeug 
wieder zusammen zu stecken und an die Pins zu geben.

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.