Forum: Mikrocontroller und Digitale Elektronik Eingänge setzen beim AT90CAN128


von Marcel B. (mazell)


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 ;)

von cskulkw (Gast)


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.

von Klaus der 3. (Gast)


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

von Marcel B. (mazell)


Lesenswert?

danke für die antworten,


ne ich hab noch kein taster angeschlossen, ich wollte die Eingänge 
einfach erstmal "intern" per software ansteuern!?

von Klaus der 3. (Gast)


Lesenswert?

Marcel Bernstedter schrieb:
> ne ich hab noch kein taster angeschlossen, ich wollte die Eingänge
> einfach erstmal "intern" per software ansteuern!?

Mit nem Debugger kannst Du zur Laufzeit die Register für den Taster 
setzen, anonsten macht das wenig Sinn...

von Marcel B. (mazell)


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 ;)

von Klaus der 3. (Gast)


Lesenswert?

Mach mal nochmal eine Klammer drum:
1
if ( (PINA & (1<<PINA2)) )
2
    {
3
    ...
4
    }

von Klaus der 3. (Gast)


Lesenswert?

Im Simulator geht es so...

von Marcel B. (mazell)


Lesenswert?

hi,

so ne ok klappt alles, hab nur was mit VCC und GND vertauscht!

von Klaus der 3. (Gast)


Lesenswert?

Marcel Bernstedter schrieb:
> so ne ok klappt alles, hab nur was mit VCC und GND vertauscht!

Jou...da würde ich aufpassen, ansonsten geht er vielleicht bald gar 
nicht mehr ;-)

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.