-
code für den ad wandler
Code:
#include <mega16.h>
#define ADC_VREF_TYPE 0x20
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned char adc_data;
// Read the 8 most significant bits
// of the AD conversion result
adc_data=ADCW;
// Place your code here
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=T
PORTA=0x00;
DDRA=0x02;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8D;
SFIOR&=0xEF;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
PS : ich habe aber keinen code geschrieben den code den du hier siehst hat der (durch die voreinstellung von mir) compiler selber erzeugt
ich habe ausserdem an AREF und AVCC 5V anliegen sowie GND mit masse verbunden und an ADC0 (pin40) zusätzlich noch 2.5V angelegt. muss ich jetzt dazu den code noch ändern oder kann ich jetzt schon ein ergebnis erhalten??? wenn ja wie?
mfg
SFR ](*,)
-
Mein Code ist in Bascom geschrieben.
Mit C kann ich auch nichts anfangen.
Vorteile von Basic bzw Bascom:
-High Levelbefehle wie "Start ADC" erleichtern das Programmieren in der Lernphase erheblich.
-Fast keine Register müssen in Bascom direkt gesetzt werden.
-Für kleine Versuche ist die Demoversion ausreichend und gut dokumentiert.
Um die Struktur der allgemeinen efizienten Programmierung zu erlernen
kann ich Bascom nur empfehlen. Habe auch damit angefangen und programmiere jetzt den MEga128 mit etwa 30Kb Code.
Außerdem finde ich auch, dass Bascom, sauber programmiert übersichtlicher ist als C.
Der einzigeGrund, warum ich C lernen würde ist die Tatsache, dass man in C komplexere Programme schreiben kann, die aber weit von denen eines Anfängers entfernt sind.
MFG
Vader
-
hier mein code in bascom:
Code:
'--------------------------------------------------------------------
' ADC.BAS
' demonstration of GETADC() function for 8535 micro
' Getadc() will also work for other AVR chips that have an ADC converter
'--------------------------------------------------------------------
$regfile = "m16def.dat"
'configure single mode and auto prescaler setting
'The single mode must be used with the GETADC() function
'The prescaler divides the internal clock by 2,4,8,15,32,64 or 128
'Because the ADC needs a clock from 50-200 KHz
'The AUTO feature, will select the highest clockrate possible
Config Adc = Single , Prescaler = Auto
'Now give power to the chip
Start Adc
'With STOP ADC, you can remove the power from the chip
'Stop Adc
Dim W As Word , Channel As Byte
Channel = 0
'now read A/D value from channel 0
Do
W = Getadc(channel)
Print "Channel " ; Channel ; " value " ; W
Incr Channel
If Channel > 7 Then Channel = 0
Loop
End
'The new M163 has options for the reference voltage
'For this chip you can use the additional param :
'Config Adc = Single , Prescaler = Auto, Reference = Internal
'The reference param may be :
'OFF : AREF, internal reference turned off
'AVCC : AVCC, with external capacitor at AREF pin
'INTERNAL : Internal 2.56 voltage reference with external capacitor ar AREF pin
'Using the additional param on chip that do not have the internal reference will have no effect.
wieso schreibt er nichts in die register ADCH und ADCL hinein ?
mfg
sfr
-
Du darfst den Code nicht irgendwie einfach kopieren.
die baudrate hast vergessen und keine geschwindigkeit deklariert=$crystal
Hier der korregierte Code.
Probier aus.
Bei deinem und bei meinem Code kommt vorerst nur der Binärwert raus, da die Umrechnung in Volt noch fehlt.
Das können Werte von 0 bis 1024 sein.
Code:
$regfile = "m16def.dat"
$crystal = 3000000
$baud = 9600
Config Adc = Single , Prescaler = Auto
Start Adc
'
Dim W As Word , Channel As Byte
Channel = 0
Do
W = Getadc(channel)
Print "Channel " ; Channel ; " Wert= " ; W
Incr Channel
If Channel > 7 Then Channel = 0
Loop
End
-
"...die zu messende Spannung darf maximal so gross wie die Referenzspannung sein."
sonst passiert was?
dankbar für antworten
-
erm......
du legst maximal +5v an und dann kannst du per spannungsteiler messen.
leg mehr an und der µC raucht dir ab ;-)
mfg knacki
//edit:
poti, links +5v, rechts gnd, mitte an den adc-port, dann kannst du werte auslesen.
ist das verständlicher für den anfang?
-
das heißt wenn ich die interne 2,56V Referenz benutze, darf am pin nicht mehr als eben diese 2,56V anliegen, richtig?
wenn dort mal eben 5V anliegen war es die letzte messung?
wär noch schön wenn ich wüßte unter welchem punkt im datenblatt dies beschrieben ist, bisher nix gefunden
p.s.: folgendes Szenario liegt vor: Spannungsteiler, wenn ich aber den GND-seitigen widerstand entferne(aufsteckbarer Tempsensor), dann hab ich auf grund des hohen eingangswiderstandes des adc knapp 5V anliegen
-
ok, jzt hab ichs gefunden