Mit Geany kannst auch für die µC's compilen, man muss halt dafür'n paar Einstellungen zurechtbasteln und des avr-gcc draufhaben.
Mit Geany kannst auch für die µC's compilen, man muss halt dafür'n paar Einstellungen zurechtbasteln und des avr-gcc draufhaben.
Hallo,
Also ich habe mich in den letzten Tagen dann nochmal an das Projekt gesetzt und nun kann ich erfolge vermerken:
#include "avr/io.h"
#include "util/delay.h"
#include "stdlib.h"
#include "avr/interrupt.h"
#include "stdio.h"
int main (void) {
DDRD = 0xff; //DDRD alle Pins Ausgang
ADMUX = 0x40; // Avcc=Referenz--> AVCC geschalten wie
// im datenblatt seite 196, abbildung 96, Rechtsbündig, PC0 gewählt
ADCSRA = 0x83; // ADC eingeschaltet, Taktung/8
while(1)
{
ADCSRA |= (1<<ADSC); // start conversion
if(ADCW<=200)
{
PORTD |= (1<<PD5);
PORTD &= ~(1<<PD6);
}
else
{
PORTD |= (1<<PD6);
PORTD &= ~(1<<PD5);
}
}
return 0;
}
//das war ja einfach
Ach ja: Ich habe den atmega16 aus versehen geschrottet, indem ich die internen 2,5V referenz eingeschalten habe und ihn extern mit 5V bestromt habedeswegen ist dieses Programm für einen Atmega8. beim atmega16 müsste das programm aber eigendlich nahezu gleich aussehen
PS: ich habe noch ein Programm geschrieben, wo der controller mehrere messwerte nimmt und dann den durchschnitt errechnet, um messfehler zu verringern. das programm wird demnächst folgen
MfG
Michael
Meine eigene cnc-Fräse:
mihuno.oyla3.de
Hallo,
erst mal Glückwunsch, dass es soweit funktioniert
Ich würde noch empfehlen, nach "start conversion" zu warten, bis der AD-Wandler wirklich fertig ist.
Das geht mit
Wenn du es wiederverwendbar programmieren möchtest, kannst du aus deiner Analog-Wandler-Routine eine Funktion (Methode) machen, die du immer wieder aufrufen kannst.Code:while(ADCSRA & (1<<ADSC)); //Warte bis Wandlung wirklich fertig ist
Grüße, Bernhard
Hallo,
Na diese berichtigung nehme ich gerne an und baue sie noch schnell in mein programm ein:
#include "avr/io.h"
#include "util/delay.h"
#include "stdlib.h"
#include "avr/interrupt.h"
#include "stdio.h"
int main (void) {
DDRD = 0xff; //DDRD alle Pins Ausgang
ADMUX = 0x40; // Avcc=Referenz--> AVCC geschalten wie
// im datenblatt seite 196, abbildung 96, Rechtsbündig, PC0 gewählt
ADCSRA = 0x83; // ADC eingeschaltet, Taktung/8
while(1)
{
ADCSRA |= (1<<ADSC); // start conversion
while(ADCSRA & (1<<ADSC)); //Warte bis Wandlung wirklich fertig ist
if(ADCW<=200)
{
PORTD |= (1<<PD5);
PORTD &= ~(1<<PD6);
}
else
{
PORTD |= (1<<PD6);
PORTD &= ~(1<<PD5);
}
}
return 0;
}
Und wie versprochen noch das programm, das den wert öfters misst und dann mit dem durchschnittswert arbeitet. in meinem Fall wird 30x gemessen und dann der errechnete endwert ausgegeben:
so, ich denke damit kann so mancher anfänger was anfangen#include "avr/io.h"
#include "util/delay.h"
#include "stdlib.h"
#include "avr/interrupt.h"
#include "stdio.h"
int main (void) {
uint8_t durchlaufzaehler=0; //zählt die durchgänge
uint16_t messwerte=0; //messwerte werden hier abgespeichert
uint16_t endwert=0; //errechneter endwert
DDRD = 0xff; //DDRD alle Pins Ausgang
while(1)
{
for(durchlaufzaehler=0;durchlaufzaehler<30;durchla ufzaehler++) //diese schleife wird 30x durchlaufen
{
ADMUX = 0x40; // Avcc=Referenz--> AVCC geschalten wie
// im datenblatt seite 196, abbildung 96, Rechtsbündig, PC0 gewählt
ADCSRA = 0x83; // ADC eingeschaltet, Taktung/8
ADCSRA |= (1<<ADSC); // start conversion
while(ADCSRA & (1<<ADSC)); //Warte bis Wandlung wirklich fertig ist
messwerte+=ADCW; // aufsummierung der messwerte
}
endwert=messwerte/30; //durchschnitt errechnen
if(endwert<=200)
{
PORTD |= (1<<PD5);
PORTD &= ~(1<<PD6);
}
else
{
PORTD |= (1<<PD6);
PORTD &= ~(1<<PD5);
}
}
return 0;
}
![]()
Geändert von frankensteins-freund (23.12.2012 um 11:53 Uhr)
Meine eigene cnc-Fräse:
mihuno.oyla3.de
Lesezeichen