Also nach dem Senden von rd todo.txt wartet er ja auf Input vom PC.
Wenn der nicht kommt, oder nicht verstanden wird, dann ist Essig.
Druckbare Version
Also nach dem Senden von rd todo.txt wartet er ja auf Input vom PC.
Wenn der nicht kommt, oder nicht verstanden wird, dann ist Essig.
wie schreibt man das?
$xramstart = &H1000
$xramsize = &H1000
???
XRAM?
Hast du externen Speicher dran? Nee oder?
Ich helfe mir immer mit "Markierungen" die der µC sendet.
Also ein fröhliches "***BREAKPOINT***" printen - wenns kommt, weiter nach unten verschieben bis es nicht mehr kommt. Dann haste deinen Hänger.
Ich tippe auf falschen Input vom PC aus. Schreib mal ne ganz einfache 4-zeilige Input-Routine an den Anfang und schau ob's geht.
Vielleicht kommt da einfach nur kein Zeilenende an.
hmmm,
also den PC lassen wir mal raus, weil der nur zum abhören ist....
Fakt ist, dass der USB Controller sendet. Als erstes sendet er: D:\>
Der µC reagiert auf die "Fertigmeldung" mit dem Print: rd todo.txt
Und darauf reagiert der USB Controller mit den 2 Werten aus der Datei vom USB Stick: "8" und "0" und danach wieder "D:\>".
Daraus schließe ich das die Kommunikation zwischen µC <-> USB Controller funktioniert.
Tobias
Ah OK, ich verstehe...
Dann mach das doch mal mit dem PRINT "XYZ" zwischen den Zeilen und schau wo er hängt.
ok Breakpoint war gut ;-)
anscheinend wird der Timer1 nicht gestartet....
Warum?
Hi, also ich würde schon empfehlen ein paar Sachen anderes zu machen, man fängt damit an das man nicht im Timer die Information sendet. Im Timer solltest du nur ein Variable setzen und im Hauptprogramm prüfen ob die Variable gesetzt ist.
If Usb_schreiben_ok = 1 then
Usb_schreiben_ok = 1
Gosub Usb_schreiben
End If
---
Timer1:
If Wartezeit = Delayms And Logging = 1 Then 'Wartezeit zwischen den Messungen
Wartezeit = 0 'Wartezeit zurücksetzen
Usb_schreiben_ok = 1
End If
return
-----------------------------------------------
so kann es nicht passieren das du:
A: Den Timer durcheinander bringst (Es können keine weitere interrupts ausgeführt werden während du diesen Timer noch Aktiv hast, erst wieder beim return).
B: Verhinderst das die Funktion aufgerufen wird bevor du das Hauptprogramm erreicht hast (Ich habe jetzt nicht ausführlich geguckt ob dieses der Fall ist, da du ja nicht wirklich viel machst zwischen Enable Interrupts und dem Maincode (Do loop)).
Musste man auch nicht Com1 vorher definieren 8 bit, No Parity, 1 Stop oder so bevor man den Benutzt als Binary? oder sind das Defaults?
Kannst ja mal ein paar Tests machen:
1. versuche mal den Timer 1 erst direkt vor dem DO zu enabeln.
2. Das oben beschrieben mit den Bit setzen und dann in Main ausführen.
3. Buffer mal die ausgabe: Config Serialout = Buffered , Size = 250
Hallo Tobias,
der Timer wird vielleicht schon gestartet. Ich könnte mir vorstellen, dass das Problem in deiner ISR Ontimer1overflow liegt. Die ist recht umfangreich und du hast da zudem zwei Gosub drin. Ich glaube, das funktioniert so nicht. Soweit ich das in Erinnerung habe, wird das bis zum Return abgearbeitet. Allerdings dann nicht das Return der ISR sondern das des Unterprogramms. In der ISR solltest du nur ein Flag setzen und den Rest in die Hauptschleife abarbeiten.
ok - ich überarbeite mal das Programm - vielen Dank erst mal.
Tobias
Läuft ;-)
bitte Schönheitsfehler bemängeln!
TobiasCode:'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m32def.dat" 'AT-Mega32
$crystal = 14745600 'Quarz: 14,7456 MHz
$baud = 9600 'Baudrate definieren
$hwstack = 80 ' default use 32 for the hardware stack
$swstack = 80 ' default use 10 for the SW stack
$framesize = 80 ' default use 40 for the frame space
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddra = &B00000000 '1 Ausgang, 0 Eingang = Pin PA7-0
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0
Ddrc = &B11111111 '1 Ausgang, 0 Eingang = Pin PC7-0
Ddrd = &B01111111 '1 Ausgang, 0 Eingang = Pin PD7-0
Porta = &B00000000 '1 = Pullup
Portb = &B00000000 '1 = Pullup
Portc = &B11111111 '1 = Pullup
Portd = &B00000000 '1 = Pullup
'-------------------------------------------------------------------------------
'Timer1 = 16 Bit
Config Timer1 = Timer , Prescale = 64 'Teiler 1/8/64/256/1024
Enable Timer1 'timer einschalten
Const Timer1vorgabe = 7936 '7936 = 4 mal pro Sekunde
Timer1 = Timer1vorgabe
On Timer1 Ontimer1overflow 'Unteprogramm aufrufen
'-------------------------------------------------------------------------------
'Analogmessung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc 'Starte analog Messung
'-------------------------------------------------------------------------------
'USB Confi!!!!
Echo Off '///für USB-Stick
Open "com1:" For Binary As #1 '///für USB-Stick
'Dim Samples As Word 'Anzahl der Messungen
Dim Delayms As Long 'Messintervall in ms (Long bis 2.147.483.647)
Dim Channels As Word 'Anzahl der Messkanäle (8Kanäle -> 0-7)(Word bis 65535)
Dim N As Integer
Dim I As Integer
Dim L As Integer
Dim S As String * 40
Dim Ad As Integer
Dim Messung As Long 'Anzahl der gemessenen Werte (Long bis 2.147.483.647)
Dim Wartezeit As Long 'Wartezeit über Timer
Dim Auslesen_ok As Bit 'ausleseroutine erfolgreich
Dim Logging As Bit '1 = Daten werden aufgezeichnet
'-------------------------------------------------------------------------------
'Vor Programmstart:
Auslesen_ok = 0
Logging = 0
Wartezeit = 999
Delayms = 0
Enable Interrupts
Start Adc 'Analogmessung starten
Usb_auslesen:
Stop Timer1
Do
Input S
Loop Until S = "D:\>" 'USB Controller abfragen, bis D:\> gesendet wird
Waitms 1000
Print "rd todo.txt" + Chr(13); 'todo.txt Datei LESEN
Input Delayms 'Wartezeit zwischen den Messungen aus Datei übernehmen
Get #1 , L
Input Channels 'Anzahl der Messkanäle aus Datei übernehmen
Get #1 , L
Input S
Auslesen_ok = 1
Start Timer1
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
'_______________________________________________________________________________
'Reset
If Pind.7 = 0 Then 'RESET
Logging = 0
Messung = 0 'Zähler für Messungen zurücksetzen
Portb.0 = 0 'schreib LED aus
Gosub Usb_auslesen
End If
'_______________________________________________________________________________
'speichern
If Logging = 1 Then
Logging = 0
Gosub Usb_schreiben
End If
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'ENDE - Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Usb_schreiben:
Print "OPW Log.txt" + Chr(13); 'Datei Log.txt öffnen
Input S
Portb.0 = 1 'schreib LED an
Incr Messung
S = Str(messung) + Chr(9)
For I = 0 To Channels 'Kanäle 0-7 MAX
Ad = Getadc(i) 'hole Analogwert von Kanal = (Variable "I")
S = S + Str(ad) 'S + aktuellen Analogkanal
If I < Channels Then S = S + Chr(9) 'wenn noch nicht alle Kanäle abgefragt wurden kommt ein Chr(9) = Tab drann!!!
Next I
S = S + Chr(13) + Chr(10) 'zum Schluss noch Zeichen 13+10 Carriage Return + Line Feed
L = Len(s) 'gibt die Länge von String "S" wieder
Print "WRF "; 'Befehl um in die geöffnete Datei zu schreiben
Put #1 , 0
Put #1 , 0
Put #1 , 0
Put #1 , L 'L ist die Länge vom String S
Put #1 , 13
Print S ;
Input S
Print "CLF log.txt" + Chr(13); 'Datei log.txt schließen
Input S
Portb.0 = 0 'schreib LED aus
Return
'-------------------------------------------------------------------------------
'TIMER SPRUNGMARKEN:
Ontimer1overflow:
Timer1 = Timer1vorgabe
Incr Wartezeit
'Toggle Portb.0 'nur zum testen ob timer1 läuft
If Wartezeit => Delayms And Auslesen_ok = 1 Then 'Wartezeit zwischen den Messungen
Wartezeit = 0 'Wartezeit zurücksetzen
Logging = 1 'Daten werden aufgezeichnet
End If
Return
PS. ich habe den Fehler im alten Programm gefunden:
irgendwie ist mir den End Befehl 2 mal ins Programm geschlichen.... :-b
Code:Usb_auslesen:
Stop Timer1
...
Start Timer1
End
Return
-------
Usb_schreiben:
...
End
Return