Anzeige:

Warum funktioniert dieser einfache code nicht?

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Warum funktioniert dieser einfache code nicht?

Von fishkowhow am 03.12.2011 22:12

Hey,

Ich bin am Atmel programmieren mit C. Nun habe ich mir ein kleines Programm geschrieben, nur wenn taster T1 gedrückt wird läuft eine kleine Blinkschleife ab.

hier erstmal der code:
1]
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>

int main(void)
{

DDRD &=~ _BV(PD2); //Taster T1= input
DDRD |= _BV(PD5); //LED 1= output

while(1){

if((PIND & (1<<PIND2)) == 1)
{
PORTD |= (1<<PD5);
_delay_ms(400);
PORTD &= ~(1<<PD5);
_delay_ms(50);

}
else
{

PORTD &= ~(1<<PD5);
}
}
return 0;
}
1]

Es ist nun so, dass das programm in diesem zustand auf dem µC keine Funktion zeigt. tausche ich die inhalte der IF und else- ausgaben und gebe oben bei der If-bedingung == 0 ein, funktioniert das Programm. Warum funktioniert es mit dem == 1 Nicht? bzw was kann ich tun, um nicht immer "querdenken" zu müssen?

MfG
Michael :D

Re: Warum funktioniert dieser einfache code nicht?

Von Alv am 04.12.2011 05:53

Ohne jetzt Ahnung von C zu haben:
Wie ist denn der Taster angeschlossen? Liefert er im gedrückten Zustand eine "0" oder eine "1"?

Von BellaD am 04.12.2011 15:19

moin


1.
vor dem include der delay.h sicherstellen das die cpu-frequenz definiert wurde (im makefile ) oder besser so:

Code:

#ifndef F_CPU
#define F_CPU 4000000UL     /* Quarz mit 4 Mhz */
#endif
#include <util/delay.h>


2.
warum benutzt du _BV und (1<< xxx) entscheide dich für eine Schreibweise Wink . _BV ist nur ein _macro und sollte der Lesbarkeit dienen, tut es aber nur wenn man sich für eine Sache entscheidet,die meisten Tut's sind bei (1<<xxx) geblieben weils halt Standard ist....


3.
Code:

//aufrufen, wenn Bit 0 gelöscht (0) ist
if ( !( PINB & 0x01 ) ) {
  // mein code ......
}
// oder ::
if (!(PINB & (1<<PINB0))) 



4.
Es gibt ein schönes Tut : http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Von fishkowhow am 04.12.2011 16:07

Hey,

Das quarz wird bei mir ja in der Makefile definiert.

Keine ahnung, das mit dem (1<<xxx) habe ich mal so gelernt, aber dann werde ich nun ab jetzt immer das (1<<xxx) Verwenden

Die taster sind bei ihrer bedienung +5v, in unberührtem Zustand 0V

MfG
Michi

Von fishkowhow am 06.12.2011 16:22

Heyhey


Ich habe versucht das Programm zu scheiben, allerfdings tritt nie die gewünschte Funktion ein, die ich mir eigendlich erhofft hatte.

Kann jemand mal meinen Code im gesamten korrigieren? ich habe das gefühl, ich habe einen fehler in der initalisierung der pins

MfG
Michael

Von BellaD am 06.12.2011 17:05

moin moin

Ich benutze AVR-Studio 4 + WinAvr

Code:

// CPU ATmega8 /8Mhz

#define F_CPU 8000000UL

#include <stdlib.h>
#include <avr/io.h>       
#include <util/delay.h>

void init_Device (void)
{
   DDRB  =0b11100000;           //PB7, PB6, PB5 als Ausgang  ,Rest Eingang
   PORTB =0b00000111;           //PullUp-Widerstand an  PB0, PB1, PB2 ein
    
}


int main (void)
{
   init_Device();
   //Modi:      

while(1){
   
         if (!(PINB & (1<<PINB0)))   // PB0
   
         {
         PORTB |= (1<<PB5);
         _delay_ms(400);
         PORTB &= ~(1<<PB5);
         _delay_ms(50);   
     
         }
         else
         {
   
         PORTB &= ~(1<<PB5);   
         }
   }
   return 0;
}       


Die Taster sollten nach masse Schalten und ich benutze die eingebauten Pull_Up Widerstände.
Port musste anpassen.
Getestet in AVRStudio im Simulator Wink
ob das jetzt bei gedrücktem Taster oder andersrum geht ? ist ja auch egal musste halt mal rumprobieren Very Happy

mfg

Von fishkowhow am 06.12.2011 18:40

Heyy,

Okay, der code sieht gut und logisch aus. aber eines gefällt mir nicht: und zwar bei der ein- und ausgangsdefinition. wie kann ich da einzelne pins definieren?( ist zwar mehr schreibaufwand, aber für mich beim programme schreiben oft hilfreich zum "abspicken"

Danke für den code Wink

MfG
Michael

Von BellaD am 06.12.2011 20:34

Ich programmiere lieber Assembler als C darum das ini mal in Binärdarstellung Wink
aber da gibt es verschiedene Möglichkeiten

zBsp.

"ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);"

mehr dazu

http://www.mikrocontroller.net/articles/Bitmanipulation

mfg

Von fishkowhow am 06.12.2011 21:06

Heyy,

Ja ich hatte es auch schon mit assembler und basic versucht. letztendlich fiel meine wahl dann eben doch auf c, keine ahnung warum.. der aufbau ist eigendlich am kompliziertesten von allen usw. aber irgendwie komme ich trotzdem noch am besten mit c klar...

MfG
Michi

Von Hotzenplotz am 06.12.2011 22:09

Sry, dass ich Dir das so vor den Latz knalle, aber Du kennst ja nicht mal die grundlegendsten Grundlagen.

Woher willst Du dann wissen womit Du besser klar kommst ?

Anzeige: