PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Blutiger Anfänger...ADC mit ATtiny2313



oZe
09.08.2007, 00:55
Hallo!
Wie schon im Titel erwähnt bin ich blutiger Anfänger was Mikrocontroller angeht. Mein Problem ist folgendes: Ich möchte zum lernen den ADC mal benutzen. Dazu habe ich folgende Vorraussetzungen:
Ich habe ein Spannungssignal zwischen 0-5V. Der Mikrocontroller soll jetzt schlicht und einfach eine LED anschalten wenn der eingangswert 5V beträgt. Wäre eventuell jemand so freundliche und würde mir diesen (für euch mit sicherheit simplen) quellcode einmal basteln mit kommentaren damit ich die verwendung des ADC lerne? Der Code sollte logischerweise in Bascom Basic geschrieben sein.

Folgenden Code habe ich mir "gedacht" wobei mir eben das genaue ansprechen des ADC fehlt:



$regfile = "2313def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000
$baud = 9600

Config Portb.0 = Output

Do
If "ADC = 5 Volt"then
Portb.0 = 1

Else
Portb.0 = 0

End If
Loop


End


Danke schon mal für eure Hilfe!

Mfg

oZe

stefan_Z
09.08.2007, 04:54
Der ADC liefert recht differenzierte Signale... mit ADC = 5V wirst du keinen Erfolg haben. Da muss wenn schon ein Wertebereich wie 4,9V bis 5,1V her (es sei denn, du hast ein ultragenaues Netzteil...).
Sowas kann man gut mit SELECT CASE machen.
Schau dir mal die Samples in der Doku an, da stehen schonmal die Grundlagen drin.

jojo3
09.08.2007, 07:13
der tiny2313 hat nur einen Analogkomperator, kann also nur Spannungen
vergleichen. Für "richtige" Analogauswertung musst du dir einen anderen Controller suchen.

stefan_Z
09.08.2007, 08:04
Na, zumindest kann er dann schonmal Spannungsunterschiede feststellen...
Von Versorgungsspannung zu ADC-Eingang...

oZe
09.08.2007, 11:19
Naja eine genauigkeit von 0,5V reicht mir schon. Das müsste dann ja eigentlich schon mit dem Komparator machbar sein. Ich werd auf jedenfall erst mal die Doku ansehen.

oZe
09.08.2007, 20:57
So ich habe mir jetzt mal die Samples angesehen. Dort finde ich leider nur was zu den "echten" ADC`s die z.b. der Mega48 besitzt. Ich habe mir jetzt folgenden Code gebastelt:



$regfile = "m48def.dat"
$crystal = 8000000
$baud = 19200
$hwstack = 32
$swstack = 8
$framesize = 24

Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Portb.0 = Output
Start Adc
Dim W As Word



Do
W = Getadc(0)

If W >= 5 Then
Portb.0 = 1

Else
Portb.0 = 0

End If

Waitms 500
Loop
End


Ist dieser Code soweit korrekt? Wo finde ich ein Beispiel wie ich das ganze mit dem Komparator vom Tiny2313 realisieren kann?
Vielen danke noch mal für die Hilfe!

jojo3
10.08.2007, 08:25
ja so sollte das schon gehen allerdings musst du bedenken,
das der Wert den du zurückbekommst ein bit wert ist d.h.
bei den 10bit Auflösung die der ADC hat gibt das bei 5V 1024
bei deiner Abfrage schaltest du bei ca. 24 mV

oZe
10.08.2007, 11:08
Alles klar danke! Jetzt brauch ich nur noch nen Lösungsansatz wie ich das mit dem Komparator umsetzen kann...

Picht
16.08.2007, 22:15
Probier mal den:

'ADC03.BAS: Vereinfachter A/D-Konverter mit Nutzung der internen PullUps
'Benötigte Hardware:
' - Nullmodemkabel zum PC für die Datenausgabe
' - Pin PB0/Ain2: 3,9 nF nach Masse (0...244 ==> 0,58mV...4,9V)
' - Pin PB1/Ain1: Mit Poti verbinden (Analoges Eingangssignal)
'-----------------------------------------------------------------------------------------------------------------------------
$regfile = "2313def.dat" 'AT90S2313-Deklarationen
$crystal = 3686400 'Verwendeter Quarz: 3.6864 MHz
$baud = 1200 'Datenausgabe zum PC mit 1200 Baud
'
Config Aci = On , Compare = Off , Trigger = Rising 'Komparator im an steigender Flanke, keine Verbindung mit Timer1
Config Timer0 = Timer , Prescale = 8 'Timer-Betrieb, Clock/8: Nach (1/3,6864MHz)*8*256 = 555 Mikrosekunden Überlauf
'
On Aci Oncomparator 'Interrupt-Routine für Komparator (Ende einer AD-Wandlung wegen normalem Ende der Messung)
On Timer0 Onoverflow 'Interrupt-Routine für Timer0 (Ende einer AD-Wandlung wegen Überlauf)
'
Dim Poti As Byte 'Die Variable Poti enthält stets den aktuellen Annalog-(Poti-)-Wert
'-----------------------------------------------------------------------------------------------------------------------------
Enable Timer0 'Timer0-Overflow-Interrupt einschalten (initialisiert auch die erste Messung)
Enable Interrupts 'Interrupts global zulassen
Do 'Hauptschleife
Printbin Poti 'UART-Datenausgabe
Loop
'-----------------------------------------------------------------------------------------------------------------------------
Onoverflow: 'Timer0-Overflow-Interrupt: Ende Entladen (oder zu hohe Spannung)
Enable Aci
Ddrb.0 = 0 'Laden starten: Pin PB0/Ain2 auf Eingang...
Portb.0 = 1 '...und PullUp einschalten
Timer0 = 0 'Timer0 zurücksetzen, Ende der Messung bei Komparator-Interrupt (oder Timer-Überlauf)
Return
'-----------------------------------------------------------------------------------------------------------------------------
Oncomparator: 'Komparator-Interrupt: AD/Wandlung beendet
Poti = Timer0 - 16 'Timer0-Wert holen und Interrupt-Zeit abziehen
Disable Aci
Portb.0 = 0 'Entladen: Pin PB0/Ain2 auf 0 Volt...
Ddrb.0 = 1 '...und auf Ausgang
Timer0 = 254 'Entlade-Ende bei Überlauf (hier nur relativ wenige Takte nötig, da Entladen nicht über Widerstand)
Return

sollte mit einen ATtiny2313 auch gehen


Wigbert