Hallo erstmal,
Programmierung:
Gcc, AVR Studio, Prozessor ATmega644P
Ziel:
Die Temperatur wird über einen KTY10 eingelesen und soll nun auf den 7
Segmentanzeigen ausgegeben werden.
Den ADC hab ich zuerst alleine ohne Ausgabe geteste: Er gibt die ADC
werte richtig aus (HTerm, UART). Nun wollte ich die drei 7 Segmente dazu
schalten und einfach mal bis 999 zählen lassen umzu kontrolliern ob mein
multiplexing Programm funktioniert. Jedoch tritt hier der Fehler auf:
Compeliern funktioniert wunderbar, jedoch sieht es soaus als würden die
7 Sgmente nun zu wenig Spannung bekommen (?), bzw. es leuchtet nur eines
sehr schwach.
Wenn ich den ADC Init auskommentiere lauft das Programm wieder wunderbar
(7-Segmente zählen bis 999).
An was kann das liegen?
wäre um jede Hilfe sehr dankbar :)
mfg Dominik
1
#include<avr/io.h>
2
#include<stdint.h>
3
#include<stdlib.h>
4
#include<util/delay.h>
5
#include<avr/interrupt.h>
6
#include<stdio.h>
7
8
//#include "uart.h"
9
#include"multiplexen.h"
10
11
uint8_tADCwert;//globale Variable für ADC wert
12
inti,k,l;
13
voidinit_Port()
14
{
15
DISPLAY_DDR=0xFF;
16
SEGMENTS_DDR=0xFF;
17
DISPLAY_PORT=0x00;
18
SEGMENTS_PORT=0x00;
19
20
}
21
22
voidinit_timerA()
23
{
24
TCCR1B|=(1<<WGM12);//CTC mode
25
TCCR1B|=(1<<CS12);// Prescaler - 256 - 62500
26
27
TIMSK1|=(1<<OCIE1A);
28
OCR1A=625;// 16e6/256/1000
29
}
30
31
voidinit_timerB()
32
{
33
34
TCCR2B|=(1<<CS22);//Prescaler 64
35
36
TIMSK2|=(1<<TOIE2);//Overflow enable
37
}
38
39
ISR(TIMER1_COMPA_vect){
40
41
i++;
42
43
if(i==1000)i=0;
44
45
if(i<10)
46
{
47
display_array[0]=i%10;
48
}
49
elseif(i>=10&&i<100)
50
{
51
display_array[0]=i%10;
52
display_array[1]=(i%100-i%10)/10;// z.B:
53
}
54
elseif(i>=100&&i<1000){
55
display_array[0]=i%10;
56
display_array[1]=(i%100-i%10)/10;
57
display_array[2]=(i%1000-i%100)/100;
58
}
59
else
60
{
61
display_array[0]=0;
62
display_array[1]=0;
63
display_array[2]=0;
64
}
65
66
}
67
68
ISR(TIMER2_OVF_vect){
69
refresh_display();
70
}
71
72
voidinti_ADC()
73
{
74
intresult;//dient zur Aufwährmung des ADC
75
76
ADMUX|=(1<<REFS0);
77
ADMUX&=~(1<<REFS1);//AVCC wird als Reference eingestellt
78
79
ADCSRA|=(1<<ADEN);//ADC wird Enabled, kann verwendet werden
80
ADCSRA|=(1<<ADSC);// ADC Start Conversation,
81
//ADCSRA |= (1<<ADATE); //Der ADC arbeitet im FreeRunning Mode,
Dein AVR stürzt dauernd ab, weil du in inti_ADC() einen IRQ frei gibst,
für den du keine ISR hast. AVR startet, LED-Anzeige startet, AVR stürzt
ab, LED-Anzeige ist dunkel...
ah danke für die schnelle Antwort :)
hmm bin wirklich noch der Leihe im Gebiet AVR programmierung.
hab jz den: ADCSRA |= (1<<ADIE); //ADC-Interrupt
deaktiviert.
Was wäre denn dein Lösungsvorschlag wie ich dieses Problem am besten
bewältige?
mfg Dominik
hab vorhin vergessen zuschreiben,
Die ADC-Werte lassen sich nun auf den 7Segment Anzeigen ausgeben.
Möchte ich aber die Werte mit dem UART zusätzlich auslesen, gibts ein
Problem.
1
init_Port();
2
init_timerA();
3
init_timerB();
4
inti_ADC();
5
uart_init();// Problemm
6
init_Port();
Wenn ich uart_init(); mit einbeziehe fangen die 7 Segmente zu flakern
an... bzw. iwas zu tun...(?)
1
#define F_CPU 16000000UL
2
#define BAUD 19200UL
3
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)
4
5
6
unsignedcharuart_putchar(unsignedcharx)
7
{
8
//Warten bis der Sendepuffer frei ist
9
while(!(UCSR0A&(1<<UDRE0)));
10
//Daten in den Puffer schreiben und damit senden
11
UDR0=x;
12
return(x);
13
}
14
15
16
unsignedcharuart_getchar()
17
{
18
//Warten bis Daten empfangen wurden
19
while(!(UCSR0A&(1<<RXC0)));
20
//Empfangsregister auslesen
21
return(UDR0);
22
}
23
24
25
//USART initialisieren
26
voiduart_init(void)
27
{
28
//Baudrate einstellen (nomal MOde)
29
UBRR0H=(uint8_t)(UBRR_BAUD>>8);
30
UBRR0L=(uint8_t)(UBRR_BAUD&0x0ff);//uint8_t
31
32
//Aktivieren von receiver und transmitter
33
UCSR0B=(1<<RXEN0)|(1<<TXEN0);
34
35
//Einstellen des Datenformats: 8 Datenbits, 1 Stopbit, no Parity
> #define DISPLAY_DDR DDRD> #define DISPLAY_PORT PORTD
Die TX/RX Leitungen hängen beim Atmega644P doch auch auf Port D. Es ist
klar, dass sich UART und Display beeinflussen. Vielleicht kannst du das
Display auf Port C hängen und den Code umschreiben (Defines anpassen).
super danke für deine Hilfe :)
funktiniert alles
ich werde nun noch einen kleinen 5V Computerventilator in mein kleines
Projekt implementieren :) der in abhängigkeit der Temperatur, schneller
oder langsamer dreht.
ich melde mich wenn es geklappt hat :)
danke nochmals
mfg Dominik