Forum: Mikrocontroller und Digitale Elektronik Taster an Atmega8 -> Problem


von Arno (Gast)


Lesenswert?

Hallo

ich habe gerade erst angefangen mit der AVR programmierung.

das board was ich mir gebaut habe funktioniert. die leds gehen und die
taster auch. habe ich mit nem Assemblerprogramm getestet.

Aber in WinAvr bekomme ich das Tasterproblem nicht in den griff. die
wollen einfach nicht gehen.

hier zum anfang erstmal das c-programm:

#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>

int main(void)
{
  DDRD = 0xff;      //Port wird als ausgang definiert
  PORTD = 0xff;      //Port wird auf High gelegt, leds leuchten nicht

  DDRC = 0x00;    //Port wird eingang
  PORTC = 0x00;      //Port wird low gesetzt und die internen pull ups 
sind
aus

  if ( (PINC & (1<<PINC2)) ) // Tasterport C , wenn pin 0 auf low geht
dann führe was aus
    {
    PORTD = 0x00;       //lege port d auf low und damit leuchten die 
leds
    }


  return(0);
}

und hier das assemblerprogramm was einigermassen funktioniert:

.include "m8def.inc"


         ldi r16, 0xFF
         out DDRD, r16     ;Port B durch Ausgabe von 0xFF ins
                           ;Richtungsregister DDRB als Ausgang
konfigurieren
         ldi r16, 0x00
         out DDRC, r16     ;Port D durch Ausgabe von 0x00 ins
                           ;Richtungsregister DDRD als Eingang
konfigurieren
loop:
         in r16, PINC      ;an Port D anliegende Werte (Taster) nach
r16 einlesen
         out PORTD, r16    ;Inhalt von r16 an Port B ausgeben
         rjmp loop         ;Sprung zu "loop:" -> Endlosschleife


Meine Taster sind low aktiv, also wenn ich den drücke geht daer port
auf low?? sehe ich das so richtig?

Kann mir jemand bitte ein richtiges beispiel programm schicken oder
sagen wo mein fehler ist.

ach einen habe ich noch:

habe auch ein problem mit der delay zeit. wollte mal ne blink led
programmieren, aber trotz _delay_(1000) blinkte die led sehr schnell.
woran kann das liegen?

thx arno

von Simon K. (simon) Benutzerseite


Lesenswert?

Ohje, da kommt wohl einer von der PC-C-Programmierung.

1. Mach mal Pullups an die Eingänge.

und hier mein vorgeschlagener code
1
#include <avr/io.h>
2
#include <stdio.h>
3
#include <inttypes.h>
4
5
int main(void)
6
{
7
  DDRD = 0xff;      
8
  PORTD = 0xff;     
9
    
10
  DDRC = 0x00;    
11
  PORTC = 0x00;      
12
13
  
14
while(1){
15
16
  if (!(PINC & (1<<PINC2))) 
17
    {
18
    PORTD = 0x00;       
19
    }
20
21
22
   //  return(0);     // return wird nicht benötigt
23
}

von Simon K. (simon) Benutzerseite


Lesenswert?

nach der if schleife natürlich noch ein }

von Arno (Gast)


Lesenswert?

Hallo und danke für deine Hilfe.

nur leider geht es immer noch nicht, die internen pullups bruache ich
nicht, habe die pull up widerstände schon am taster dran. wie das
beispiel hier auf der seite im tutorial. aktive low heißt das :-)

nur verstehe ich das nicht, wenn ich die "Tastatur" an meine C51
Prozie dran baue ( programmiere schon seit ca 6 Monaten assembler)
funktionieren die super.

am atmega8, wenn er mit assembler, programiert ist leuchten die elds
die eigentlich mit dem taster geschaltet werden immer leicht. man
könnte fast sagen sie flackern. wenn ich dann den taster schließe dann
gehen die leds aus.

auch wenn ich den port wechsel geht auch es nicht
also taster an d und les an c.

thx arno

von Arno (Gast)


Lesenswert?

Hallo,

ok programm funzt super. habe den fehler gefunden. die doppelten
widerstände waren der fehler.

habe jetzt die taster direkt an den AVR und massu gelegt. geht super.

thx für deine Hilfe

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.