timer1

technicus123

Neues Mitglied
13. Feb. 2009
118
0
0
Sprachen
hi,

ich habe bei meinem Projekt einen Atmega644 verwendet. Dort wollte ich heute den Timer1 starten, das dieser immer 1 Sekunde hochzählt. Allerdings fängt das komplette Display was an dem Prozessor hängz an zu flackern und verschiebt die Anzeigen wenn der Timer startet und läuft. Hat da jemand eine Idee was das sein kann? Ich muss dazu noch sagen, das ich den Timerpin nicht mit einem Widerstand beschaltet habe. der hängt frei.

Gruß
Technicus123
 
Hallo,

Dort wollte ich heute den Timer1 starten, das dieser immer 1 Sekunde hochzählt. Allerdings fängt das komplette Display was an dem Prozessor hängz an zu flackern und verschiebt die Anzeigen wenn der Timer startet und läuft. Hat da jemand eine Idee was das sein kann?
ich tippe mal, das der Timer-Interrupt deine Display-Routinen aus dem Timing
bringt. Aber um das zu sehen müßte man den Quellcode haben ;)

Gruß
Dino
 
hi dino,

hier der code. einmal der vom display und einmal der vom timer.

gruß
technicus123

Code:
$regfile = "m644def.dat"
$crystal = 4000000


Config Graphlcd = 240 * 128 , Dataport = Portb , Controlport = Portd , Ce = 5 , Cd = 3 , Wr = 2 , Rd = 4 , Reset = 1 , Fs = 0 , Mode = 8



Config Timer1 = Timer , Prescale = 1024                     
Enable Timer1
On Timer1 Isr_von_timer1                                    
Timer1 = 59465

--------------------über touch einschalten-------------------------

 If X4 =< 90 And X4 => 60 And Y4 =< 245 And Y4 => 160 Then
   Enable Interrupts  <-- wenn der interrupt aktiviert wird geht  das chaos los.
   Set Portc.2
   Set Portc.4
   Reset Porta.7
   Waitms 1000
   Ovendiff2 = Tim + Oven2zeit
   End If
 
Interessant wäre, wie deine ISR von Timer1 aussieht. In deinem Code ist der Teil leider nicht enthalten.

HBA
 
Hallo Tehnicus !

Ich kann dir auf Grundlage deines Programmcodes leider auch keine Hinweise geben.....
Irgendwie fehlt mir da noch so einiges an Input.


Wäre schön, wenn du uns das Programm hier mal zusammenhängend einstellen könntest.

Gruß,
Cassio
 
Hi,

hier ist der rest.

gruß
technicus123



CodeBox Bascom

$regfile = "m644def.dat"
$crystal = 4000000


Config Graphlcd = 240 * 128 , Dataport = Portb , Controlport = Portd , Ce = 5 , Cd = 3 , Wr = 2 , Rd = 4 , Reset = 1 , Fs = 0 , Mode = 8

'#############################PWM-TIMER2##########################

Config Timer2 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 8

'#############################A/D-Wandler##########################
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'##################################################################

Dim X As Word , Y As Word
Dim X2 As Single , Y2 As Single
Dim X3 As Single , Y3 As Single
Dim X4 As Byte , Y4 As Byte


'############################ Menü Variabel ########################

Dim I As Byte
I = 1

Dim Cmmenux As Single
Cmmenux = 0

Dim Cmmenuy As Single
Cmmenuy = 0

Dim Led1 As Single
Led1 = 0

'##################################################################
Start Adc

Cursor Off

Config Porta.7 = Output
Config Porta.6 = Output
Config Portc = Output
Cls
Showpic 32 , 5 , Sell
Waitms 3000
Cls
'##################### TIMER1 / Eieruhr ###########################

Config Timer1 = Timer , Prescale = 1024 'Konfiguriere Timer1
Enable Timer1
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Timer1 = 59465

Dim Tim As Integer
Tim = 1

Dim Oven1zeit As Integer
Dim Oven2zeit As Integer

Oven1zeit = 5000
Oven2zeit = 5000


Dim Ovendiff1 As Integer
Dim Ovendiff2 As Integer

Ovendiff1 = 1
Ovendiff2 = 1
'##################################################################



Do

'############################## Hauptmenü #####################

Select Case I

Case 1:

Showpic 1 , 1 , Menu

'################### Start-Menu Coffeemaker #################################

If Y4 =< 220 And Y4 => 40 And I = 1 Then
Cmmenux = Cmmenux + 1
Else
Cmmenux = 0
End If

If X4 =< 40 And X4 => 10 And I = 1 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 1 Then
I = 2
End If
'############################################################################


'###################### Start-Menu Oven #####################################

If X4 =< 90 And X4 => 55 And I = 1 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 1 Then
I = 3

End If

'############################################################################

'#################### Start-MenuWorklight ###################################

If X4 =< 140 And X4 => 100 And I = 1 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 1 Then
I = 4

End If
'############################################################################
Case 2:

Showpic 1 , 1 , Cmmenu

'#####################Coffeemaker-Hauptmenu #################################

'Back Funktion

If Y4 =< 220 And Y4 => 40 And I = 2 Then
Cmmenux = Cmmenux + 1
Else
Cmmenux = 0
End If

If X4 =< 140 And X4 => 100 And I = 2 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 2 Then
I = 1
End If

'COFFEEMAKER 1 MENÜ

If X4 =< 30 And X4 => 15 And I = 2 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 2 Then
I = 5

End If

'COFFEEMAKER 2 MENÜ

If X4 =< 90 And X4 => 60 And I = 2 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 2 Then
I = 6

End If

'###########################################################################

Case 3:

Showpic 1 , 1 , Ovmenu

'########################### Oven Menu #####################################


'Back Funktion
If Y4 =< 220 And Y4 => 40 And I = 3 Then
Cmmenux = Cmmenux + 1
Else
Cmmenux = 0
End If

If X4 =< 140 And X4 => 100 And I = 3 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 3 Then
I = 1
End If


'Oven 1 menu

If X4 =< 40 And X4 => 10 And I = 3 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 3 Then
I = 7
End If

'Oven 2
If X4 =< 90 And X4 => 55 And I = 3 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 3 Then
I = 8
End If

'############################################################################

Case 4:

Showpic 1 , 1 , Worklight

'##################### Worklight Menu #######################################

'Back Funktion
If Y4 =< 95 And Y4 => 10 And I = 4 Then
Cmmenux = Cmmenux + 1
Else
Cmmenux = 0
End If

If X4 =< 145 And X4 => 115 And I = 4 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 4 Then
I = 1
End If

'LED OFF
If X4 =< 145 And X4 => 115 And Y4 =< 245 And Y4 => 160 Then
Pwm2a = 255
Waitms 1000
End If

'LED Bright
If X4 =< 90 And X4 => 60 And Y4 =< 95 And Y4 => 10 Then
Pwm2a = 1
Waitms 1000
End If

'LED Dimm
If X4 =< 90 And X4 => 60 And Y4 =< 245 And Y4 => 160 Then
Pwm2a = 240
End If

'############################################################################

Case 5:

Showpic 1 , 1 , Cm1

'##################### COFFEEMAKER 1 MENU ###################################

'Back Funktion
If Y4 =< 220 And Y4 => 40 And I = 5 Then
Cmmenux = Cmmenux + 1
Else
Cmmenux = 0
End If

If X4 =< 140 And X4 => 100 And I = 5 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 5 Then
I = 2
End If

'Led Off
If X4 =< 90 And X4 => 60 And Y4 =< 245 And Y4 => 160 Then
Reset Portc.0
Waitms 1000
End If

'LED ON
If X4 =< 90 And X4 => 60 And Y4 =< 95 And Y4 => 10 Then
Set Portc.0
Waitms 1000
End If


'############################################################################

Case 6:

Showpic 1 , 1 , Cm2

'##################### COFFEEMAKER 2 MENU ####################################

'Back Funktion
If Y4 =< 220 And Y4 => 40 And I = 6 Then
Cmmenux = Cmmenux + 1
Else
Cmmenux = 0
End If

If X4 =< 140 And X4 => 100 And I = 6 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 6 Then
I = 2
End If

'Led Off
If X4 =< 90 And X4 => 60 And Y4 =< 245 And Y4 => 160 Then
Reset Portc.1
Waitms 1000
End If

'LED ON
If X4 =< 90 And X4 => 60 And Y4 =< 95 And Y4 => 10 Then
Set Portc.1
Waitms 1000
End If

'############################################################################

Case 7:

Showpic 1 , 1 , Ov1

'####################Oven 1 Hauptmenu #######################################

'Back Funktion
If Y4 =< 95 And Y4 => 10 And I = 7 Then
Cmmenux = Cmmenux + 1
Else
Cmmenux = 0
End If

If X4 =< 145 And X4 => 115 And I = 7 Then
Cmmenuy = Cmmenuy + 1
Else

Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 7 Then
I = 3
End If


'oven OFF
If X4 =< 145 And X4 => 115 And Y4 =< 245 And Y4 => 160 Then
Reset Portc.3
Reset Porta.6
Reset Portc.5
Waitms 1000
End If


'oven 150 ON
If X4 =< 90 And X4 => 60 And Y4 =< 95 And Y4 => 10 Then
Enable Interrupts
Set Portc.3
Reset Portc.5
Set Porta.6
Waitms 1000
Ovendiff1 = Tim + Oven1zeit
End If

'210 c on
If X4 =< 90 And X4 => 60 And Y4 =< 245 And Y4 => 160 Then
Enable Interrupts
Set Portc.3
Reset Porta.6
Set Portc.5
Waitms 1000
Ovendiff1 = Tim + Oven1zeit
End If






'############################################################################

Case 8:

Showpic 1 , 1 , Ov2

'####################Oven 2 Hauptmenu #######################################

'Back Funktion
If Y4 =< 95 And Y4 => 10 And I = 8 Then
Cmmenux = Cmmenux + 1
Else
Cmmenux = 0
End If

If X4 =< 145 And X4 => 115 And I = 8 Then
Cmmenuy = Cmmenuy + 1
Else
Cmmenuy = 0
End If

If Cmmenux = 1 And Cmmenuy = 1 And I = 8 Then
I = 3
End If

'oven OFF
If X4 =< 145 And X4 => 115 And Y4 =< 245 And Y4 => 160 Then
Reset Portc.2
Reset Porta.7
Reset Portc.4
Waitms 1000
End If


'oven 150 ON
If X4 =< 90 And X4 => 60 And Y4 =< 95 And Y4 => 10 Then
Enable Interrupts
Set Portc.2
Reset Portc.4
Set Porta.7
Waitms 1000
Ovendiff2 = Tim + Oven2zeit
End If

'210 c on

If X4 =< 90 And X4 => 60 And Y4 =< 245 And Y4 => 160 Then
Enable Interrupts
Set Portc.2
Set Portc.4
Reset Porta.7
Waitms 1000
Ovendiff2 = Tim + Oven2zeit
End If


End Select

'###############################################################################

'########################### Touch auswerten ###################################

Gosub Readtouch

If X > 330 Then
X3 = X - 310
X2 = X3 / 2.89
X4 = X2
Else
X4 = 0
End If

If Y > 150 Then
Y3 = Y - 130
Y2 = Y3 / 2.78
Y4 = Y2
Else
Y4 = 0
End If

Loop

'###############################################################################

'########################## Touch auslesen #####################################

Readtouch:
Config Pina.0 = Output
Config Pina.2 = Output
Set Porta.2
Reset Porta.0
Ddra.1 = 0
Ddra.3 = 0
Waitms 20
Y = Getadc(1)
Y = 1024 - Y

Config Pina.1 = Output
Config Pina.3 = Output
Set Porta.3
Reset Porta.1
Ddra.0 = 0
Ddra.2 = 0
Waitms 20
X = Getadc(0)
X = 1024 - X

Return

'###############################################################################

'######################### menu anzeigen #######################################

Menu:
$bgf "MenuNeu.bgf"
Waitms 100
Return

Cmmenu:
$bgf "cmmenuneu.bgf"
Waitms 100
Return

Ovmenu:
$bgf "ovenmenuneu.bgf"
Waitms 100
Return

Worklight:
$bgf "worklightneu.bgf"
Waitms 100
Return

Cm1:
$bgf "cm1neu.bgf"
Waitms 100
Return

Cm2:

$bgf "cm2neu.bgf"
Waitms 100
Return

Sell:
$bgf "sell3.bgf"
Waitms 5000
Return

Ov1:
$bgf "oven1neu.bgf"
Waitms 100
Return

Ov2:
$bgf "oven2neu.bgf"
Waitms 100
Return



Isr_von_timer1: 'ISR von Timer1
Timer1 = 59465 'Timer1 soll wieder von 59465 wegzählen

If Portc.3 = 1 Then
Tim = Tim + 1
End If

If Portc.2 = 1 Then
Tim = Tim + 1
End If

If Portc.2 = 0 And Portc.3 = 0 Then
Tim = 1
End If


If Portc.3 = 1 And Ovendiff1 = Tim Then
Reset Portc.3
Reset Portc.5
Reset Porta.6
End If

If Portc.2 = 1 And Ovendiff2 = Tim Then
Reset Portc.2
Reset Porta.7
Reset Portc.4
End If

Return

End
 
Hallo Technicus!

Ich möchte jetzt nicht behaupten, dass ich in der Kürze der Zeit dein Programm komplett verstanden habe......
Das ist wohl auch nicht möglich und du hast es bestimmt auch nicht in 10 Minuten geschrieben. ;)

Allerdings verstehe ich so einige Dinge nicht, die du mir mal erklären musst.

Warum startest du eigentlich den ADC?
Die meisten Pins von Port.A nimmst du doch sowieso nur als ganz normale Ausgänge......

Dann verstehe ich dieses "späte" "Enable Interrupts" überhaupt nicht! :hmmmm:

Der Befehl "Enable Interrupts" hat eigentlich nur zur Folge, dass erst einmal global die Möglichkeit geschaffen wird, Interrupts zu erzeugen.
Du musst aber teilweise die speziellen Interrupts noch separat aktivieren.
Zum Beispiel: "Enable Timer1"
Starten und stoppen kannst du den Timer dann mit: "Start Timer1" bzw. "Stop Timer1"


Ich habe auch noch mal deine Display-Config durchgesehen.....
Trotz der Anweisung "Controlport = Portd"
und dem PWM mittels Timer2, scheint es keine Konflikte zu geben.
OC2A und OC2B liegen auf PD.6 und PD.7 ...... deine Display-Config betrifft aber nur PD.0 bis PD.5 !


Wie schon geschrieben....
Am meisten wundert mich dein "Enable Interrupts" mitten im Programm.... und dann nicht nur einmal! :hmmmm:
Vielleicht hast du deshalb auch Probleme damit?

Schau dir doch noch mal einige Beispiele in der BASCOM-Hilfe an.


Gruß,
Cassio
 
Noch eine Frage: Welche Werte benutzt du für die Stacks und den Frame?

Edit: Noch 'ne Frage: Warum benutzt du für Cmmenux und Cmmenuy Single Typen? Ich sehe da immer nur einfache Additionen von 1.
Das dauert etwa 30 mal solange wie ein Incr Byte. Gleiches gilt für IF-Abfragen.
X2, X3 und Y2,Y3 könnten bestimmt auch durch Word Typen ersetzt werden. Dort müsstest du nur die beiden Divisionen durch 2.89 und 2.78 ersetzen.

HBA
 
Hi Cassio,

den AD-Wandler starte ich wegen dem Touch. Da brauche ich nunmal welche. Das mit der PWM und dem LCD funktioniert einwandfrei. Da hatte ich keine Probleme bis jetzt gehabt. Nur wenn der Timer1 kommt dann wird das Komplette Menü auf dem Display verzerrt. Die Enable Interrupts habe aus dem Programm rausgenommen und durch START Timer1 ersetzt. Immernoch das gleiche Problem.

Gruß
Technicus
 
Die Enable Interrupts habe aus dem Programm rausgenommen und durch START Timer1 ersetzt. Immernoch das gleiche Problem.

Hallo !

Da du immer noch das gleiche Problem hast, wirst du das "Enable Interrupts" nicht völlig entfernt sondern nur in den Header eingefügt haben.

Bevor du den Timer mit "Start" und "Stop" steuern kannst, musst du im Header einmal den Timer1 auch einschalten..... "Enable Timer1".
Das wird aber wohl nicht der Schlüssel zum Glück sein.

Ich überlege gerade, ob irgend etwas Anderes schon den Timer1 benötigt.... obwohl es so nicht sichtbar ist.... und es daher zu Problemen kommt.


Das mit dem ADC muss ich mir noch mal ansehen....
Habe auf die Schnelle gar keine Abfrage der AD-Wandler gefunden. Da habe ich das Programm wohl einfach zu schnell überflogen. ;)

Mal sehen, wann ich noch etwas Zeit dafür finde.
Heute, an Silvester, wird das wohl schwieriger werden. ;)

Gruß,
Cassio
 
Hi Technicus!

Da ich gerade mal ein paar Minuten Kaffeepause hatte, habe ich mir deinen Code noch mal angesehen... und ihn nebenbei mal mit dem BASCOM-Highlight versehen. ;)


Was ich so gar nicht verstehe ist das hier:


CodeBox Bascom

'########################## Touch auslesen #####################################

Readtouch:
Config Pina.0 = Output
Config Pina.2 = Output
Set Porta.2
Reset Porta.0
Ddra.1 = 0
Ddra.3 = 0
Waitms 20
Y = Getadc(1)
Y = 1024 - Y

Config Pina.1 = Output
Config Pina.3 = Output
Set Porta.3
Reset Porta.1
Ddra.0 = 0
Ddra.2 = 0
Waitms 20
X = Getadc(0)
X = 1024 - X

Return


Was soll denn das "Output" und "Input" geschalte an den ADC-Ports? :hmmmm:

Ich werde daraus nicht schlau!

Gruß,
Cassio
 
Hallo,

Was ich so gar nicht verstehe ist das hier:


CodeBox Bascom

'########################## Touch auslesen #####################################

Readtouch:
Config Pina.0 = Output
Config Pina.2 = Output
Set Porta.2
Reset Porta.0
Ddra.1 = 0
Ddra.3 = 0
Waitms 20
Y = Getadc(1)
Y = 1024 - Y

Config Pina.1 = Output
Config Pina.3 = Output
Set Porta.3
Reset Porta.1
Ddra.0 = 0
Ddra.2 = 0
Waitms 20
X = Getadc(0)
X = 1024 - X

Return


Was soll denn das "Output" und "Input" geschalte an den ADC-Ports? :hmmmm:

Ich werde daraus nicht schlau!
ich glaube ich kann das erklären ;) Irgendwo hab ich das mal gelesen ...
Die beiden Folien sind an den entgegengesetzten Seiten mit Anschlüssen
versehen. Die eine oben und unten, die andere links und rechts. Wenn man
sie mit dem Finger berührt, dann bildet der Verbindungspunkt einen
Spannungsteiler.
Durch das abwechselnde anlegen von Spannung mal an die eine Folie
(PA0=0, PA2=1) und dann an die andere (PA1=0, PA3=1) kann man einmal
die Y- und einmal die X-Komponente des Berührungspunktes messen.

Gruß
Dino
 
hi,

richtig dino genau so läuft es ;) und es funktioniert einwandfrei. ich gebe auf x1 spannung, lese die auf x2 aus und ermittel den wert darüber. das gleiche gilt für y. relativ einfach. ich weiß bloß nicht ob das auch kapazitiv klappt. da müsste man es etwas anders machen.

gruß
technicus
 
Hi Dino, hi Technicus!

Soweit habe ich mir das schon mit der Touchfolie gedacht.....

Nur ob die Vorgehensweise beim Programmablauf so im "Sinne des Erfinders" ist (auf den ADC bezogen), bezweifle ich ein wenig.

Darum habe ich ja auch nach den ganzen "Richtungswechseln" auf den ADC-Ports gefragt! ;)

Nun ist es aber noch ein wenig früh, um darüber nachzudenken..... :sleep:


Bis später dann.....
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)