|
Gepost op zaterdag 3 April 2010 20:01:06 |
 |
print ook inorde (heb nog niet de code ingezien btw? )? |
http://pascalbianca.blogspot.nl/ |
|
Gepost op zaterdag 3 April 2010 20:03:51 |
 |
Er komt wel 00,00,00 op de lcd. |
|
|
Gepost op zaterdag 3 April 2010 20:08:23 |
 |
Laat eens een teller mee op je display lopen, kan je zien of je pic niet vast hangt en alles doorloopt. Ik denk niet dat dat het geval bij u is en je pic vast hangt. |
Veel te weinig tijd voor mijn projecten of heb ik er soms te veel? |
|
Gepost op zaterdag 3 April 2010 21:02:13 |
 |
code aangepast, met teller op tweede regel.
De teller op de 2e regel loopt, de teller op de 1e regel doet nog steeds niets.
Device 16F628A ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT,WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
Declare LCD_ENPIN = PORTA.6 ;De EN aansluiting moet nu aan PORTA.6
Declare LCD_RSPIN = PORTA.7 ;De RS aansluiting moet nu aan PORTA.7
Declare LCD_LINES = 4
Symbol START_button = PORTB.0 ; START button
Symbol STOP_button = PORTB.1 ; STOP button
Symbol CLEAR_button = PORTB.2 ; CLEAR button
Dim Ticks As Byte ; Tick count (61 ticks = 1 sec)
Dim Hour As Byte ; Hour variable
Dim Minute As Byte ; Minute variable
Dim Second As Byte ; Second variable
Dim Disp As Byte ; Disp = 1 to update display
Dim Delay As Byte ; Used to Debounce button
Dim TELLER As Byte
TRISA = 0 ; PORTA is output
TRISB = 7 ; RB0,RB1,RB2 are inputs
DelayMS 500 ; Wait 0.5 sec for LCD to initialize
Hour = 0 ;Clear hours
Minute = 0 ;Clear minutes
Second = 0 ;Clear seconds
Ticks = 0 ;Clear ticks
Disp = 1 ; Force to display 00:00:00 at startup
OPTION_REG = $05 ; Set prescaler = 64
On Interrupt GoTo ISR ; ISR routine
Print $FE, 1 ; Clear LCD
LOOP:
While 1 = 1 ;Oneindige lus
Print At 2, 1, DEC3 TELLER ;Plaats actuele waarde van variabele 'Teller'
DelayMS 500 ;Tel snelheid
Inc TELLER ;Teller met 1 verhogen
If START_button = 0 Then
TMR0 = 0 ; Initialize TMR0 register
INTCON.5 = 1 ; Enable timer interrupt
Disp = 1 ; Enable display
EndIf
If STOP_button = 0 Then
INTCON.5 = 0 ; Disable timer interrupt
Disp = 1 ; Enable display
EndIf
If CLEAR_button = 0 Then
Hour = 0
Minute = 0
Second = 0
Ticks = 0
Disp = 1
EndIf
If Disp = 1 Then
Print $FE, 2
Print DEC2 Hour,",",DEC2 Minute, ",",DEC2 Second
Disp = 0
EndIf
Wend
GoTo LOOP
ISR:
Ticks = Ticks + 1
If Ticks < 61 Then NoUpdate
Ticks = 0
Second = Second + 1
If Second = 60 Then
Second = 0
Minute = Minute + 1
If Minute = 60 Then
Minute = 0
Hour = Hour + 1
If Hour = 24 Then
Hour = 0
EndIf
EndIf
EndIf
Disp = 1
NoUpdate:
INTCON.2 = 0 ; Re-enable TMR0 interrupts
Resume
Enable ; Re-enable interrupts
End
End ; End of program
|
|
|
Gepost op zaterdag 3 April 2010 21:06:53 |
 |
Dan hebben we nog even een schema nodig om na te kijken. |
Veel te weinig tijd voor mijn projecten of heb ik er soms te veel? |
|
Gepost op zaterdag 3 April 2010 21:48:44 |
 |
krijg met [img]en [img] plaatje er niet in! |
|
|
Gepost op zaterdag 3 April 2010 22:23:32 |
 |
Er moet een / in de laatste tag. Als het dan nog niet werkt dan gewoon de link posten. |
Met vriendelijke groet, Stynus ||| www.elektronicastynus.be |
|
Gepost op zaterdag 3 April 2010 23:17:28 |
 |
Hierbij de link:https://docs.google.com/leaf?id=0BzoOJimOaU9OOWQ4YWI2YTctMDY3Yi00MjRhLWJhNTEtMWIzYTgzZDgyNGNl&hl=en |
|
|
Gepost op zondag 4 April 2010 15:54:17 |
 |
Je hebt je knoppen aan de massa hangen met een weerstand en je zegt
Code |
If CLEAR_button = 0 Then
Hour = 0
Minute = 0
Second = 0
Ticks = 0
Disp = 1
EndIf
|
Je zet dus continu je uur, minuten enz, op 0, je pic zal nooit tellen.
Moet het niet worden als je clear butten = 1 dat je alles wist. |
Veel te weinig tijd voor mijn projecten of heb ik er soms te veel? |
|
Gepost op zondag 4 April 2010 21:51:57 |
 |
Alle knoppen 1 gemaakt, nu is de teller op regel 1 weg!
Op regel 2 staat 255.
Code |
Device 16F628A ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT,WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
Declare LCD_ENPIN = PORTA.6 ;De EN aansluiting moet nu aan PORTA.6
Declare LCD_RSPIN = PORTA.7 ;De RS aansluiting moet nu aan PORTA.7
Declare LCD_LINES = 4
Symbol START_button = PORTB.0 ; START button
Symbol STOP_button = PORTB.1 ; STOP button
Symbol CLEAR_button = PORTB.2 ; CLEAR button
Dim Ticks As Byte ; Tick count (61 ticks = 1 sec)
Dim Hour As Byte ; Hour variable
Dim Minute As Byte ; Minute variable
Dim Second As Byte ; Second variable
Dim Disp As Byte ; Disp = 1 to update display
Dim Delay As Byte ; Used to Debounce button
Dim TELLER As Byte
TRISA = 0 ; PORTA is output
TRISB = 7 ; RB0,RB1,RB2 are inputs
DelayMS 500 ; Wait 0.5 sec for LCD to initialize
Hour = 0 ;Clear hours
Minute = 0 ;Clear minutes
Second = 0 ;Clear seconds
Ticks = 0 ;Clear ticks
Disp = 1 ; Force to display 00:00:00 at startup
OPTION_REG = $05 ; Set prescaler = 64
On Interrupt GoTo ISR ; ISR routine
Print $FE, 1 ; Clear LCD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP:
While 1 = 1 ;Oneindige lus
Print At 2, 1, DEC3 TELLER ;Plaats actuele waarde van variabele 'Teller'
DelayMS 500 ;Tel snelheid
Inc TELLER ;Teller met 1 verhogen
If START_button = 1 Then
TMR0 = 0 ; Initialize TMR0 register
INTCON.5 = 1 ; Enable timer interrupt
Disp = 1 ; Enable display
EndIf
If STOP_button = 1 Then
INTCON.5 = 0 ; Disable timer interrupt
Disp = 1 ; Enable display
EndIf
If CLEAR_button = 1 Then
Hour = 0
Minute = 0
Second = 0
Ticks = 0
Disp = 1
EndIf
If Disp = 1 Then
Print $FE, 2
Print DEC2 Hour,",",DEC2 Minute, ",",DEC2 Second
Disp = 0
EndIf
Wend
GoTo LOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ISR:
Ticks = Ticks + 1
If Ticks < 61 Then NoUpdate
Ticks = 0
Second = Second + 1
If Second = 60 Then
Second = 0
Minute = Minute + 1
If Minute = 60 Then
Minute = 0
Hour = Hour + 1
If Hour = 24 Then
Hour = 0
EndIf
EndIf
EndIf
Disp = 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NoUpdate:
INTCON.2 = 0 ; Re-enable TMR0 interrupts
Resume
Enable ; Re-enable interrupts
End
End ; End of program
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
Gepost op zondag 4 April 2010 22:07:31 |
 |
Is dit geen fout:
Code |
Ticks = Ticks + 1
If Ticks < 61 Then NoUpdate
|
moet dat niet
Code |
Ticks = Ticks + 1
If Ticks < 61 Then GOTO NoUpdate
|
zijn. (Denk ik) |
Veel te weinig tijd voor mijn projecten of heb ik er soms te veel? |
|
Gepost op maandag 5 April 2010 10:55:05 |
 |
Ik heb de ingangen dus anders gezet, geen resultaat.
Code tav NoUpdate aangepast:
Code |
Disable
ISR:
Ticks = Ticks + 1
If Ticks < 61 Then GoTo NoUpdate
|
geen verschil.
Hoe kan ik zien of de tmr0 het wel doet? |
|
|
Gepost op maandag 5 April 2010 11:28:24 |
 |
Het simpelste is een ledje bijzetten en dat laten knipperen door de interrupt routine. |
Met vriendelijke groet, Stynus ||| www.elektronicastynus.be |
|
Gepost op maandag 5 April 2010 15:38:03 |
 |
[quote=dannymyron]Ik zie dat ge software interrupt gebruikt, dat is om problemen
vragen. Voorbeeld ge gebruikt al delayms 500, nu wacht de pic 500 ms
en kan dan pas indien nodig de interrupt afwerken. Dit is te laat
als ge Timer0 als klok wilt gebruiken.
Ik gebruik daarom steeds hardware interrupt.
Hieronder voorbeeld van klok op hardware interrupt.
bij "hier u programma" kan je de knoppen programmeren om te starten....enz
ik zie in je programma dat je GIE (= INTCON.7= Global Interrupt Enable) niet op 1 hebt gezet,moet je doen anders krijg je geen interrupt.
'****************************************************************
'* Name : hardware interrupt klok *
'* Author : Gijsbrechts Danny *
'* Notice : Copyright (c) 2010 Gijsbrechts Danny *
'* : All Rights Reserved *
'* Date : 5/04/2010 *
'* Version : 1.0 *
'* Notes : Timer1 verhoogt telkens +- 1/120sec *
'* : telkenmaal timer1 = 120 = 1 seconden *
'****************************************************************
Device 16F628A
Config INTRC_OSC_NOCLKOUT,WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
Declare LCD_ENPIN = PORTA.6 ;De EN aansluiting moet nu aan PORTA.6
Declare LCD_RSPIN = PORTA.7 ;De RS aansluiting moet nu aan PORTA.7
Declare LCD_LINES = 4
Dim Uren As Byte
Dim Minuten As Byte
Dim Seconden As Byte
Dim Timer1 As Byte
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
OPTION_REG = %00000111 ' Initiate the interrupt
TMR0 = 223 '
T0IE = 1 ' Enable TMR0 overflow interrupt
GIE = 1 ' Enable global interrupts
Clear ' clear all variables
Minuten = 59 ' voorbeeld 59 minuten
Seconden = 55 ' voorbeeld 55 seconden
Uren = 23 ' voorbeeld 23 uren
ON_HARDWARE_Interrupt GoTo Interrupt
Cls 'clear display
loop:
'************** hier u programma ************
Print At 1,1,DEC2 Uren,":",DEC2 Minuten,":",DEC2 Seconden
GoTo loop
; ****************************************************************
; ** Interrupt Handler **
; ****************************************************************
Interrupt:
Context SAVE
If T0IF = 0 Then exit_interupt
TMR0 = 223 '1/120sec interrupt
Timer1 = Timer1 + 1
If Timer1 = 120 Then
Inc Seconden
Timer1 = 0
EndIf
If Seconden = 60 Then
Seconden = 0
Inc Minuten
EndIf
If Minuten = 60 Then
Minuten = 0
Inc Uren
EndIf
If Uren = 24 Then Uren = 0
T0IF = 0 ' Clear the TMR0 overflow flag
exit_interupt:
Context Restore 'Restore the registers and exit interrupt
[Bericht gewijzigd door dannymyron op Maandag 5 April 2010 21:52:07] |
|
|
Gepost op donderdag 8 April 2010 19:34:13 |
 |
Ik heb het geprobeerd, maar er komt alleen 23:59:55 op het display en dat was het!
Ik ben het even kwijt. |
|
|
Gepost op donderdag 8 April 2010 22:39:28 |
 |
heb je mijn programma geprobeerd zoal gepost zonder wijziging, moet werken bij mij toch.
zet deze regel is tussen de loop:
Print At 2,1,DEC3 TMR0," ",dec3 Timer1
de getallen wijzigen heel snel, controle werking interrupt |
|
|
Gepost op donderdag 8 April 2010 23:27:55 |
 |
Hierbij mijn aanpassing tav knoppen:klopt dit nog?
Code |
Device 16F628A
Config INTRC_OSC_NOCLKOUT,WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
Declare LCD_ENPIN = PORTA.6 ;De EN aansluiting moet nu aan PORTA.6
Declare LCD_RSPIN = PORTA.7 ;De RS aansluiting moet nu aan PORTA.7
Declare LCD_LINES = 4
Dim Uren As Byte
Dim Minuten As Byte
Dim Seconden As Byte
Dim Timer1 As Byte
Dim Disp As Byte ; Disp = 1 to update display
Symbol START_button = PORTB.0 ; START button
Symbol STOP_button = PORTB.1 ; STOP button
Symbol CLEAR_button = PORTB.2 ; CLEAR button
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
OPTION_REG = %00000111 ' Initiate the interrupt
TMR0 = 223 '
T0IE = 1 ' Enable TMR0 overflow interrupt
GIE = 1 ' Enable global interrupts
Clear ' clear all variables
Minuten = 59 ' voorbeeld 59 minuten
Seconden = 55 ' voorbeeld 55 seconden
Uren = 23 ' voorbeeld 23 uren
Disp = 1
ON_HARDWARE_Interrupt GoTo Interrupt
Cls 'clear display
loop:
'************** hier u programma ************
Print At 2,1,DEC3 TMR0," ",DEC3 Timer1
If START_button = 1 Then
TMR0 = 0 ; Initialize TMR0 register
INTCON.5 = 1 ; Enable timer interrupt
Disp = 1 ; Enable display
EndIf
If STOP_button = 1 Then
INTCON.5 = 0 ; Disable timer interrupt
Disp = 1 ; Enable display
EndIf
If CLEAR_button = 1 Then
Uren = 0
Minuten = 0
Seconden = 0
Disp = 1
EndIf
If Disp = 1 Then
Print $FE, 2
Print DEC2 Uren,",",DEC2 Minuten, ",",DEC2 Seconden
Disp = 0
EndIf
GoTo loop
; ****************************************************************
; ** Interrupt Handler **
; ****************************************************************
Interrupt:
Context SAVE
If T0IF = 0 Then exit_interupt
TMR0 = 223 '1/120sec interrupt
Timer1 = Timer1 + 1
If Timer1 = 120 Then
Inc Seconden
Timer1 = 0
EndIf
If Seconden = 60 Then
Seconden = 0
Inc Minuten
EndIf
If Minuten = 60 Then
Minuten = 0
Inc Uren
EndIf
If Uren = 24 Then Uren = 0
T0IF = 0 ' Clear the TMR0 overflow flag
exit_interupt:
Context Restore 'Restore the registers and exit interrupt
|
[/img] |
|
|
Gepost op donderdag 8 April 2010 23:45:18 |
 |
als je mijn programma probeert zonder dat je er iets
aan wijzigt of bijplaats zie je de klok dan werken ? |
|
|
Gepost op vrijdag 9 April 2010 16:36:29 |
 |
@dannymyron
Het programma door jouw geplaatst loopt, klasse.
Mijn vraag de interrupt word telkens aangeroepen, hardware interrupt.
Maar een hardware interrupt kun je toch alleen maar via een input(portb.0) activeren? |
|
|
Gepost op vrijdag 9 April 2010 16:51:47 |
 |
Nee, een microcontroller kan een interrupt genereren om verschillende redenen. [Bericht gewijzigd door Stynus op Zondag 11 April 2010 15:49:23] |
Met vriendelijke groet, Stynus ||| www.elektronicastynus.be |
|
2 » |
|
|