Anzeige:

Schwierigkeiten: erstes Programm/ADC,Interrupts, Arrays

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Von Caligula am 30.11.2012 19:00

Hallo,

hab die USB-UART-Bridge richtig anschließen können. Klappt alles super!

Jetzt habe ich noch eine Frage laut dem Datenblatt des Atmega32 (S.44) gibt es einen Inerrupt, der ausgelöst wird, sobald irgendwas empfangen wird. Wie kann ich auf diesen zugreifen? Der Interrupt nennt sich: UART Receive Complete.

Das funktioniert nicht:

Code:
On Rxc On_empfangen                                 'Interrupt um Messung zu beginnen
Enable Rxc
...............
...............
...............
...............
...............
...............
...............
On_empfangen:                                               'Messung ein/ausschalten
Toggle Status
Toggle Portc.0
Zeit = 0
Impulse = 0
Timer1 = 0
Return


Schönes Wochenende!

Caligula

Von Sam am 01.12.2012 01:48

"Enable Interrupts" könnte eventuell helfen Smile

Von Caligula am 01.12.2012 15:23

Interrupts habe ich enabled.

Von Sam am 01.12.2012 15:41

Ok, gut, dann ersetze mal RXC durch URXC

Von Caligula am 06.12.2012 17:42

Hallo,

so den URXC akzeptiert der Compiler, aber wie löse ich den jetzt aus? Müsste doch über Putty gehen oder? Einfach tippen? Der Interrupt wird nicht ausgelöst.

Gruß

Caligula

Meine Firmware sieht mittlerweile so aus:



Code:
$regfile = "M32def.dat"                                     'es handelt sich um einen ATmega32
$crystal = 4915200                                          'der Quarz-Oszillator läuft mit 4,9152 Mhz
$hwstack = 100                                              'im Speicher werden für den Hardware-Stack 100 Byte reserviert
$swstack = 100                                              'im Speicher werden für den Software-Stack 100 Byte reserviert
$framesize = 100                                            'im Speicher werden für den Frame 1900 Byte reserviert
$baud = 9600

Ddra = &B00000000                                           'alle als Input-ADC
Ddrd = &B00000000                                           'PD2(Durchflusszähler); und PD3 -->Pullup einschalten
Ddrc = &B00000001                                           'hier ist eine LED angeschlossen deswegen Output

Portd.3 = 1                                                 'internen Pull Up aktivieren

Const Messzeit = 10                                         'Wie viele Sekunden soll gemessen werden?

Dim Impulse As Word                                         'Anzahl der Impulse seit Messungsbeginn, bis 2^16; Durchflussmesser: 10^4 Impulse pro Liter
Dim Status As Bit                                           'Messung an/aus
Dim Spannung(messzeit) As Word                              'Arrays
Dim Verbrauch(messzeit) As Byte                             'reicht aus, da kein 50ccm-Motor der Welt einen höheren Verbrauch innerhalb einer Sekunde haben wird ;D
Dim Zeit As Byte                                            'wird jede Sekunde um 1 hochgezählt
Dim I As Byte                                               'für Forschleife

Dim Tsp1 As Single
Dim Tsp2 As Single                                          ' von variablen unterschiedlicher wertigkeit
Const Adc_multi = 0.048828125                               ' = (5.0 / 1024.0) *10            'constante für umrechnung adc = ph-Wert(liegt zwischen 700 und 1400mV)

Von_vorn:

Status = 0                                                  'Initialisierungen
Portc.0 = 0
Zeit = 0

On Urxc On_empfangen                                        'Interrupt um Messung zu beginnen; sobald "irgendetwas" über UART empfangen wird
Enable Urxc

Config Timer1 = Timer , Prescale = 256                      'Timer einstellen: 19200 Signale für 1s

On Int1 On_int1                                             'Interrupt für Impulse
Config Int1 = Falling

Config Adc = Single , Prescaler = Auto , Reference = Avcc   'für den ADC: AVCC Referenzspannung verwenden
Start Adc                                                   'ADC starten

Enable Interrupts                                           'Interrupts global einschalten. Das ist der Hauptschalter für alle Interrupts

Do

If Status = 1 Then                                          'Nur enabeln wenn die Messung begonnen werden soll
Enable Int1
End If                                                      'mainloop

If Timer1 = 19200 And Status = 1 Then
Disable Interrupts                                          'Interrupts ausschalten, dass der ADC nicht gestört wird/Einstellungen im Multiplexer könnten fatal manipuliert werden
Incr Zeit
Spannung(zeit) = Getadc(0)                                  'Spannung die an PC0 anliegt (Zahl zwischen 0 und 1024(=5V))
Verbrauch(zeit) = Impulse
Impulse = 0
Timer1 = 0
Enable Interrupts
End If

If Zeit >= Messzeit Then
Status = 0

Print "pH-Werte"
For I = 0 To Messzeit Step 1
Tsp1 = Spannung(i) * Adc_multi
Print Tsp1
Next I

Print "Verbrauch"
For I = 0 To Messzeit Step 1
Tsp2 = Verbrauch(i) / 10000                                 'in ml, da 10 000 Impulse pro l
Print Tsp2
Next I

Portc.0 = 1                                                 'LED für Anzeige Datenübetragung (blinkend)
Waitms 400
Portc.0 = 0
Waitms 400
Print "Datensatz wurde übermittelt."
Wait 3                                                      'periodisch senden

If Status = 1 Then
Goto Von_vorn
End If

End If

Loop                                                        'mainloop

End                                                         'Ende des Programms

On_empfangen:                                               'Messung ein/ausschalten
Toggle Status
Toggle Portc.0
Zeit = 0
Impulse = 0
Timer1 = 0
Return

On_int1:                                                    'ein Impuls registriert
Incr Impulse
Return

Von Caligula am 06.12.2012 22:04

Guten Abend,
ich habe noch eine Frage: Kann ich mit einem Mikrocontroller ein sauberes nicht prellendes Signal emulieren? So zum Beispiel?

Gruß

Caligula

Code:

$regfile = "attiny13.dat"
$Crystal=4000000
$hwstack=20
$swstack=20
$framesize=20

Ddrb = &B00001000                                           'als output PB3


Do
Portb.3 = 1
Waitms 10
Portb.3 = 0
Waitms 234
Loop

End

Anzeige: