Forum: Mikrocontroller und Digitale Elektronik Atmega48 Port C als Ausgang?


von Thomas R. (r3tr0)


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
}

von Theor (Gast)


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.

von Hubert G. (hubertg)


Lesenswert?

VCC mit AVCC verbunden?
Wo sagst du dem DDRC Register das die Port 0-3 Ausgang sind?

von Thomas R. (r3tr0)


Lesenswert?

Die Else-Schleife wars...
Dankeschön! Hab einfach zu quer gedacht und den einfachen Fehler nicht 
gesehen.

von Ralf (Gast)


Lesenswert?

Thomas R. schrieb:
> Die Else-Schleife wars

ARG ... immer wieder gerne geschrieben und deswegen die Leute 
auseinander genommen.

von Korinthen Kacker (Gast)


Lesenswert?

Thomas R. schrieb:
> Die Else-Schleife wars...

Else-Schleifen gibt es nicht!

... in allen gängigen C-Dialekten jedenfalls ....

von Murr (Gast)


Lesenswert?

Korinthen Kacker schrieb:
> Thomas R. schrieb:
>> Die Else-Schleife wars...
>
> Else-Schleifen gibt es nicht!
>
> ... in allen gängigen C-Dialekten jedenfalls ....

Es gibt keine if-Schleifen!

von Thomas R. (r3tr0)


Lesenswert?

Nagut.. :) Die else-Anweisung wars :>

von Route_66 H. (route_66)


Angehängte Dateien:

Lesenswert?

Korinthen Kacker schrieb:
> Else-Schleifen gibt es nicht!

Doch!
Meine Else hat eine schöne Schleife; ich kenne aber keine IF-Schleife.

von Norbert S. (norberts)


Lesenswert?


von Ober Lehrer (Gast)


Lesenswert?

Norbert S. schrieb:
> http://www.if-schleife.de/

Themaverfehlung!

Der TO berichtete ausdrücklich dass

Thomas R. schrieb:
> Die Else-Schleife wars...

und nicht eine If-Schleife!

von Norbert S. (norberts)


Lesenswert?

Oh, dann nehme ich die 6 hin und setze mich. Am besten auf die Hände...

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.