Atmega48 Port C als Ausgang?

OP #5325537
Lesenswert?

Hallo zusammen,

ich habe einen Atmega48 und möchte den PORT C als Ausgang nutzen.
Jedoch messe ich bei den Ausgängen nur sehr geringe Spannungen.
PORTC0= 2,8V
PORTC1= 1,7V
PORTC2= 2,8V
PORTC3= 5,0V //so sollte es sein.

Ich versuche mit jedem Ausgang einen Transistor zu schalten, welche mir 
ein Relais durchschalten. Leider funktioniert es nur bei PC3 und PC2.

Es gibt kein JTAG Fuse zum ausschalten, AREF ist nicht mit VCC 
verbunden.
Habe mich gefühlt schon durch das halbe Internet und durch das 
Datenblatt gewühlt, ich komme einfach nicht drauf.

Hier ist mein Code, ich hoffe jemand kommt auf den Trichter und könnte 
mir einen kleinen Tipp geben.



/*-------------- SPI definieren---------*/
#define F_CPU    8000000UL
#define SPI_DDR    DDRB
#define SPI_PORT   PORTB
#define SPI_MOSI   PB3
#define SPI_MISO   PB4
#define SPI_SCK   PB5

// Inputs definition
#define HS_MITTE        (PIND & (1<<PD0))  //Eingang um Handschalter 
Mitte auszulesen.
#define HS_M1_AB        (PIND & (1<<PD1))  //Eingang um Handschalter M1 
Ab auszulesen.
#define HS_M2_AB         (PIND & (1<<PD2))  //Eingang um Handschalter M2 
Ab auszulesen.
#define HS_M1_AUF        (PIND & (1<<PD4))  //Eingang um Handschalter M1 
Auf auszulesen.
#define HS_M2_AUF        (PIND & (1<<PD3))  //Eingang um Handschalter M2 
Auf auszulesen.
#define ES_M1_MITTE        (PINC & (1<<PC4))  //Eingang um Endschalter 
M1 Mitte auszulesen.
#define ES_M2_MITTE        (PINC & (1<<PC5))  //Eingang um Endschatler 
M2 Mitte auszulesen.

// Outputs definition
#define M1_AUF_AN        PORTC |= (1<<PC0)  //Motor 1 up on.
#define M1_AB_AN        PORTC |= (1<<PC1)  //Motor 1 down on.
#define M2_AUF_AN        PORTC |= (1<<PC2)  //Motor 2 up on.
#define M2_AB_AN        PORTC |= (1<<PC3)  //Motor 2 down on.

#define M1_AUF_AUS        PORTC &= ~(1<<PC0)  //Motor 1 up off.
#define M1_AB_AUS        PORTC &= ~(1<<PC1)  //Motor 1 down off.
#define M2_AUF_AUS        PORTC &= ~(1<<PC2)  //Motor 2 up off.
#define M2_AB_AUS        PORTC &= ~(1<<PC3)  //Motor 2 down off.

// Includes
#include <avr/io.h>      //Header Controller defs. auswahl über makefile
void init(void);

int main()
{

  init();
  while(1)
  {
    if(HS_M1_AUF)
    {
      M1_AUF_AN;
    }
    if(HS_M1_AB)
    {
      M1_AB_AN;
    }
    if(HS_M2_AUF)
    {
      M2_AUF_AN;
    }
    if(HS_M2_AB)
    {
      M2_AB_AN;
    }
    else
    {
      M1_AB_AUS;
      M1_AUF_AUS;
      M2_AB_AUS;
      M2_AUF_AUS;
    }
  }
  return 0;
}

void init(void)
{
  // INPUTS
  DDRD &= ~(1<<PD0);    //HS_MITTE
  DDRD &= ~(1<<PD1);    //HS_M1_AB
  DDRD &= ~(1<<PD2);      //HS_M2_AB
  DDRD &= ~(1<<PD3);      //HS_M2_AUF
  DDRD &= ~(1<<PD4);      //HS_M1_AUF
  DDRC &= ~(1<<PC4);    //ES_M1_MITTE (Endschalter M1 Mitte)
  DDRC &= ~(1<<PC5);    //ES_M2_MITTE (Endschalter M2 Mitte)
  // OUTPUTS
  DDRC |= (1<<PC0);    //SIG_M1_AUF
  DDRC |= (1<<PC1);    //SIG_M1_AB
  DDRC |= (1<<PC2);    //SIG_M2_AUF
  DDRC |= (1<<PC3);    //SIG_M2_AB
}
Gast #5325576
Lesenswert?

Hm.

Könnte es sein, dass der else-Fall bei Deiner Messung eintritt?
1
    if(HS_M2_AB)
2
    {
3
      M2_AB_AN;
4
    }
5
    else
6
    {
7
      M1_AB_AUS;
8
      M1_AUF_AUS;
9
      M2_AB_AUS;
10
      M2_AUF_AUS;
11
    }

Ich stelle die These auf, dass Du nicht wirklich willst, dass alle 
Ausgänge auf Low gehen falls alleine HS_M2_AB auf Low steht. Magst Du 
das mal überprüfen? Das heisst nämlich auch, dass, selbst falls einer 
der Ausgänge in den vorhigen Code-Zeilen auf High gesetzt wird, er nur 
sehr kurz auf High bleibt, falls HS_M2_AB auf Low steht. Ist das 
wirklich so gewollt?

Vielleicht auch mal den Schaltplan posten.

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