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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas R. (r3tr0)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


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

von Thomas R. (r3tr0)


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

von Ralf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Thomas R. schrieb:
> Die Else-Schleife wars

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

von Korinthen Kacker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Thomas R. schrieb:
> Die Else-Schleife wars...

Else-Schleifen gibt es nicht!

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

von Murr (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Nagut.. :) Die else-Anweisung wars :>

von Route_66 H. (route_66)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht lesenswert

von Ober Lehrer (Gast)


Bewertung
0 lesenswert
nicht 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)


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.