Hm, das hat aber nix mit dem Board zu tun, sondern ist grundsätzlich bei allen AVR-Controllern so - bei Deiner Erfahrung solltest Du das eigentlich wissen... ;)Zitat:
Zitat von oberallgeier
Gruß,
askazo
Druckbare Version
Hm, das hat aber nix mit dem Board zu tun, sondern ist grundsätzlich bei allen AVR-Controllern so - bei Deiner Erfahrung solltest Du das eigentlich wissen... ;)Zitat:
Zitat von oberallgeier
Gruß,
askazo
Hallo oberallgeier und askazo,
herzlichen Dank für eure Hilfe. Wie schon erwähnt - Anfänger. Ich hab mein erstes Board seit einer Woche und kenne es quasi noch gar nicht und vor allem - ich weiß auch noch gar nicht was wichtig ist/was man wissen muss.
Daher herzlichen Dank für die Erklärung. Ich werde entsprechend den Code nochmal überprüfen und meine Logik überdenken. Mal schauen ob es dann klappt.
Bis dahin...
Georg
so, hier Version 2.0
Die Schaltung ist diese: http://olimex.com/dev/images/avr-p28-sch.gif
Und dieses hier der Code. Ich hatte aber noch keine Gelegenheit zu prüfen, ob er auf dem Board funktioniert. Für das Ein-/Ausschalten habe ich mich dieses Mal über #define entschieden, weil es weniger Code benötigt und die Übergabe einer Variable spart.
Code:#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#define LEDon PORTC &= ~(1<<5); //LED ein mit PORTC5 als 0 da LED auf VCC
#define LEDoff PORTC |= (1<<5); //LED aus mit PORTC5 als 1 da LED auf VCC
void initialize();
int main(void)
{
initialize();
while(1)
{
static uint16_t i=0;
if(PIND & (1<<2)) //Wenn der Button gedrückt ist
{
LEDon; //LED ein und Zähler i auf 0
i=0;
}
else //Ist der Button nicht gedrückt
{ //i++ und 1ms Pause
i++;
_delay_ms(1);
}
if(i >= 1999)) //Ist i größer 2sec
{
Ledoff; //LED aus und Zähler i auf 0
i=0;
}
}
return 0;
}
void initialize()
{
DDRB = 0x00; //B als Eingang
DDRC = (1<<5); //C5 als Ausgang für LED
DDRD = 0x00; //D als Eingang
PORTD = (1<<2); //PORTD2 mit PullUp-Widerstand (Doppelt zur Schaltung)
LEDon; //zwei Mal blinken als Bestätigung
_delay_ms(200);
LEDoff;
_delay_ms(500);
LEDon;
_delay_ms(200);
LEDoff;
}
Hi,
mein Bord funktioniert mit diesem Code:
/* Sample program for Olimex AVR-P28 with ATMega8 processor
* Blinks the led with a speed ~2Hz using a simple delay loop.
* Compile with AVRStudio+WinAVR (gcc version 3.4.6)
*/
#define __AVR_ATmega8__ 1
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
void Initialize(void)
{
PORTB = 0x0;
PORTC = 1<<5; /* turn the LED off */
PORTD = 0x0;
DDRB = 0x0;
DDRC = 1<<5; /* PD5 as output - the LED is there */
DDRD = 0x0;
}
/* state = 0 -> Led Off
* state = 1 -> Led On
* state !=[0,1] -> Led Toggle
*/
void LedSet(unsigned char state)
{
switch (state)
{
case 0:
PORTC &= ~(1<<5);
break;
case 1:
PORTC |= 1<<5;
break;
default:
if (PORTC & 1<<5)
PORTC &= ~(1<<5);
else
PORTC |= 1<<5;
}
}
int main(void)
{
int i;
Initialize();
while (1)
{
LedSet(0);
_delay_ms(200);
//for (i=60000;i;i--);
LedSet(1);
_delay_ms(200);
//for (i=60000;i;i--);
}
return 0;
}
Gruß
Kurt
Also es zeigt sich, dass bei mir die _delay_ms() Funktion nicht das tut, was sie soll. Das oben genannte Beispiel (welches das vom Anbieter mitgelieferte Beispiel ist, nur mit delay_ms) funktioniert auch nicht.
Optimierung ist auf -0s eingestellt.
#include <util/delay.h> am Anfang eingefügt.
Außerdem werde ich nach der Frequency gefragt, hier habe ich für den ATMega8-16PU ......
TADAAAA, es Klappt liebe Leute. Das Problem lag in der Angabe der Frequenz F_CPU. Mit 1000000 klappt jetzt alles ganz gut ;-)
ohne F_CPU aber mit delay hätte der (Pre-)Compiler aber eigentlich ne Warnung ausspucken müssen...
Nicht wenn man als Frequence 1000 drin stehen hat und nicht bedenkt dass ein Unterschied zwischen Hz und kHz besteht (zu meiner Verteidigung - ich hab einfach nicht drauf geachtet oder daran gedacht).
Und so versinkt die Hilfe netter Leute in einem schwarzen Loch aus Dummheit von einem. Trotzdem herzlichen Dank nochmal. Bin begeistert wie schnell und ausführlich hier im Forum geholfen wird...
Grüße
Georg
Einstein würde Dich wegen dieses Ausdrucks beneiden, wenn er die schwarzen Löcher schon gekannt / noch erlebt hätte. Ich dagegen wär froh, wenn meine Dummheit ein schwarzes Loch wäre - weil schwarze Löcher ausserhalb ihres Ereignishorizontes nix rauslassen. Bei denen bleibt die Dummheit drin - bei mir nicht *ggg* - und es ist mit der Dummheit noch seltsamer - die Massenbilanz stimmt nicht - dauernd strömt was raus, aber es wird nicht weniger. Das alles ist aber nicht wirklich ernst gemeint.Zitat:
Zitat von Lightstorm
Na ich weiß nicht, bei meinem AVRStudio meckerte er nicht. Ich hab das gerade ausprobiert. ABER ich habe auch brav unter [Configuration Options] die Frequency: [1000000] hz stehen . . . .Zitat:
Zitat von Jaecko
@oberallgeier: Sehr geiler Spruch!!!
Ich hab die Frequenz auch nur in der Konfiguration in AVRStudio eingetragen. Mehr braucht es nicht.
Wenn die Frequenz bei der Config drinsteht, wird F_CPU automatisch definiert; es taucht automatisch die Compileroption -DF_CPU=xxx auf.
Lässt sich auch prüfen, wenn da was drinsteht und dann im Programm nochmal #define F_CPU xxx versucht wird.