Eingänge setzen beim AT90CAN128

OP #2299331
Lesenswert?

hi,

aufgrund meiner Arbeit muss ich mich seit letzter Woche mit 
mikrocontroller programmieren beschäftigen.

für den einstieg wollte ich erstmal meine LED auf dem controller per 
"internen" eingang ein und ausschalten.

habe dazu das tutorial gelesen aber meine Led reagiert nicht auf den 
Eingang?!

die LED in der schleife alleine funktioniert soweit

mein code:

int main(void)
{


   while(1)
 {


DDRC  &= ~(1<<DDC7);  /* Pin PC7 als Eingang */
PORTC |= (1<<PC7);
//PINC &= (1<<PIN7);

if ( PIN7 == 1)
{
  DDRB = (1<<DDB7);
    PORTB = PORTB & ~(1<<PB7); //Led setzen
    //PORTB |= (1<<PB7);   //LED löschen
}


}

return 0;
}



vllt könnt ihr mir sagen wo da der Fehler liegt?!

thx für antworten ;)
Gast #2299404
Lesenswert?

Läßt sich der Code überhaupt kompilieren?

PIN7 ist allenfalls eine define aber keine Variable.

Wenn ja, muß sich hier auf einen Port festgelegt werden z. B. PINA und 
dann gibt es ein 8-Bit breites Datenbyte zurück.

Also Du kannst vielleicht




if(PINC & PIN7)
{
 ...  schreiben.

alternativ:

uint8 Variable = 0;


....

main
{

DDRC = 0x7F; (ist das gleiche wie ~(1<<PIN7)

while(1)
{
 Variable = PINC;

if (Variable & 0x80) // alternativ (1<<PIN7)
{

PORTB = 0x01; oder was auch immer




Vielleicht wäre es hilfreich erst einmal die grundsätzlichen 
C-Kenntnisse für die Mikrokontroler zu erlernen. Dann wird vielleicht 
auch mal Spaß beim Programmieren auftreten.

Übrigens ist es nicht sinnvoll das Data Direction Register DDRC in der 
Schleife ständig zu beschreiben. So etwas nennt man Initialisierung und 
wird i. d. R. vor dem Eintritt in die while-schleife gemacht.
Gast #2299420
Lesenswert?

Du hast mehrere "Fehler".
Die Initialisierung (Festlegung ob Ein/Ausgang, Pullupwiderstände, usw.) 
macht man normalerweise Außerhalb der Endlosschleife.
Braucht man ja nur 1 Mal definieren, es sei denn Du möchtest einen Pin 
mal als Eingang und später als Ausgang definieren.

Des weiteren ist das hier falsch:
1
if ( PIN7 == 1)
2
{
3
...
4
}

PIN7 ist ein Makro. Also irgendwo über #define PIN7 7 definiert.
Im Prinzip steht da nur:
1
if (7 == 1)
2
{
3
...
4
}

Und das ist immer falsch!
Schau mal nochmal das Tutorial an.

Du tust auch nirgends Deinen Pin wieder Rücksetzen wenn der Taster nicht 
mehr gedrückt ist. Somit wird er nur 1 Mal gesetzt und bleibt dann an.

Probier mal dass hier:
1
#include <avr/io.h>
2

3
int main(void)
4
{
5
DDRC &= ~(1<<DDRC7);//Ist Standardmäßig schon ein Eingang, aber ok
6
PORTC |= (1<<PC7);  //Pullup an Taster an
7

8
DDRB |= (1<<DDRB7);  //PB7 als Ausgang definieren, da LED
9

10
while(1)
11
  {
12
  if ( !(PINC & (1<<PINC7)) )//Taster betätigt (Low aktiv durch Pullup)
13
    {
14
    PORTB |= (1<<PB7);   //High Pegel an PB7
15
    }
16
  
17
  else          //Taster nicht betätigt
18
    {
19
    PORTB &= ~(1<<PB7);  //Low Pegel an PB7
20
    }
21
  }
22

23
return 0;
24
}

Müsste softwaremäßig so passen.
Bist Du Dir auch sicher wie Du die Hardware angeschlossen hast?
Also Taster an Pin C7 und GND.
LED über Vorwiderstand an Vcc oder GND (je nach dem was für eine Logik 
Du realisiert haben möchtest).
Bei Atmels ist es glaub ich nicht so relevant, da sie intern 
Highsideswitches und Lowsideswitches haben. Früher bei den 8051 war nur 
ein Lowsideswitch drinnen und so hat man die LED über den Vorwiderstand 
an Vcc (z.B. +5V) angeschlossen.

Grüße

Grüße
OP #2299633
Lesenswert?

so ich habe das jetzt mal mit äußeren Taster gebaut.

mein code sieht jetzt so aus:

int main(void)
{
  DDRB = (1<<DDB7);
  DDRA  &= ~(1<<DDA2);
  PORTA |= (1<<PA2);




   while(1)
 {


if ( PINA & (1<<PINA2) )
    {

    PORTB &=   ~(1<<PB7); //Led setzen
    //PORTB |= (1<<PB7);   //LED löschen
    }
else
    {
    PORTB |= (1<<PB7);
    }


}

return 0;
}



Problem: beim ein und ausschalten an PINA2 (oder PIN2) geht die LED 
immer noch nicht an oder aus ;)

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