Gast
#1636445
Hallo zusammen,
ich benötige nochmals Eure Hilfe. Ich möchte gerne das Programm zum
AnalogDigitalwandler dahingehend abändern dass ich den Prescaler
hardwaremäßig einstellen kann. Dafür habe ich direkt nach dem while(1)
die Abfrage If, else if, else if eingefügt. Danach funktioniert
plötzlich die nächste If-Abfrage "ADC-Result auf RS232 ausgeben" nicht
mehr (LED an PB2 bleibt dunkel). Wenn ich die If-Abfrage "Prescaler
einstellen" herausnehme funktioniert es wieder.(LED an PB2 leuchtet)
Was kann ich falsch gemacht haben. Ich komme einfach nicht darauf.
Gruß
Holger
#define PROZESSORTAKT 3680000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "rs232.h"
// Variablendeklaration
unsigned char c[500]; //Messwertspeicher
char temp[5];
int j,i,x,y,z; // j,i für Schleifen, x,y,z für Prescalerauswahl
ISR(ADC_vect)
{
c[j] = ADCH; /* Nur ADCH lesen, weil 8-Bit Modus */
if (j<500) // 500 Messwerte einlesen
{
j++;
}
}
int main(void)
{
PORTD |= (1<<PD2)| (1<<PD3)| (1<<PD4)| (1<<PD5); //Pull up
einschalten
DDRD &= ~ (1<<PD2)| (1<<PD3)|(1<<PD4)| (1<<PD5); // PDX als Eingang
DDRB = (1<<PB0) | (1<<PB1)| (1<<PB2); // PBX als Ausgang
/* RS232 einschalten ...*/
setup_uart();
uart_putline("[ RS232 eingeschaltet]");
// Alle Interrupts erlauben
sei();
// ADC, 8-Bit im Free Running Mode mit Interrupt
// Referenzspannung: VCC
ADMUX = (1<<REFS0) | (1<<ADLAR); // Auswahl Referenzspannung,
Ergebniss left adjust
ADCSRA = (1<<ADEN) | (1<<ADFR) | (1<<ADIE); // ADC Enable, Free
running mode, Interrupt enabled
// Endlosschleife
while (1)
// Prescaler hardwaremäßig einstellen
if ((!(PIND & (1<<PIND3))) && (x==0))
{
ADCSRA |= (1<<ADPS2)| (0<<ADPS1) | (0<<ADPS0); //
Prescaler 16
// ADC starten!
ADCSRA |= (1<<ADSC);
PORTB |= (1<<PB0);
x=1;
y=0;
z=0;
}
else if ((!(PIND & (1<<PIND4))) && (y==0)) // Prescaler 4
{
ADCSRA |= (0<<ADPS2)| (1<<ADPS1) | (0<<ADPS0);
// ADC starten!
ADCSRA |= (1<<ADSC);
PORTB |= (1<<PB1);
x=0;
y=1;
z=0;
}
else if ((!(PIND & (1<<PIND5))) && (z==0)) // Prescaler 2
{
ADCSRA |= (0<<ADPS2)| (0<<ADPS1) | (1<<ADPS0);
// ADC starten!
ADCSRA |= (1<<ADSC);
x=0;
y=0;
z=1;
}
// ADC Resultat auf RS232 ausgeben ============/
if (!(PIND & (1<<PIND2)))
{
PORTB |= (1<<PB2);
for (i=0;i<500;i++)
{
itoa(c[i], temp, 10); /* In einen String konvertieren
... */
uart_putchar('\n');
uart_putchar ('\r');
uart_putstring(temp);
}
j = 0;
}