Pinabfrage Problem Atmega8

Gast #2681607
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
Gast #2682201
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.
Gast #2682361
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren