Probier mal den:
Code:
'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
Lesezeichen