SchemaTheek
 
Home Nieuws Forum Schema's Artikelen Magazine Downloads Links Shops Zoeken
 
Controle Paneel
Gebruikersnaam
Wachtwoord
  Onthoud mij
» Wachtwoord?
» Registreren
Site info
» Het Team
» Contact
» FAQ
» Leden
» Upload Archief
Stats
Totaal online: 15
15 gasten
0 leden:
Forum > Digitaal > Teller met 16F628A lukt niet
[1] 2 »
snuggels
Lid
Berichten: 24
Gepost op zaterdag 3 April 2010 19:56:25 QuoteWijzig

Hallo,

Ik ben sinds kort met picbasic begonnen.Ik gebruik de proton IDE.
Ik gebruik 3 drukknoppen op poort B.0,B.1 en B.2
De 00,00,00 komt wel in beeld maar er komt geen reactie op de poort B.0 als je een drukknop indrukt.
Ik snap even niet wat er mis gaat.
Dit is mijn 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

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:

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
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


Wie wil mij helpen?
pascalbianca
Lid
Berichten: 1444
Gepost op zaterdag 3 April 2010 20:01:06 QuoteWijzig

print ook inorde (heb nog niet de code ingezien btw? )?


http://pascalbianca.blogspot.nl/
snuggels
Lid
Berichten: 24
Gepost op zaterdag 3 April 2010 20:03:51 QuoteWijzig

Er komt wel 00,00,00 op de lcd.

reddevil
Lid
Berichten: 1268
Gepost op zaterdag 3 April 2010 20:08:23 QuoteWijzig

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?
snuggels
Lid
Berichten: 24
Gepost op zaterdag 3 April 2010 21:02:13 QuoteWijzig

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

reddevil
Lid
Berichten: 1268
Gepost op zaterdag 3 April 2010 21:06:53 QuoteWijzig

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?
snuggels
Lid
Berichten: 24
Gepost op zaterdag 3 April 2010 21:48:44 QuoteWijzig

krijg met [img]en [img] plaatje er niet in!

Stynus
Admin
Berichten: 2850
Gepost op zaterdag 3 April 2010 22:23:32 QuoteWijzig

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
snuggels
Lid
Berichten: 24
Gepost op zaterdag 3 April 2010 23:17:28 QuoteWijzig

Hierbij de link:https://docs.google.com/leaf?id=0BzoOJimOaU9OOWQ4YWI2YTctMDY3Yi00MjRhLWJhNTEtMWIzYTgzZDgyNGNl&hl=en

reddevil
Lid
Berichten: 1268
Gepost op zondag 4 April 2010 15:54:17 QuoteWijzig

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?
snuggels
Lid
Berichten: 24
Gepost op zondag 4 April 2010 21:51:57 QuoteWijzig

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   
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   

reddevil
Lid
Berichten: 1268
Gepost op zondag 4 April 2010 22:07:31 QuoteWijzig

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?
snuggels
Lid
Berichten: 24
Gepost op maandag 5 April 2010 10:55:05 QuoteWijzig

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?

Stynus
Admin
Berichten: 2850
Gepost op maandag 5 April 2010 11:28:24 QuoteWijzig

Het simpelste is een ledje bijzetten en dat laten knipperen door de interrupt routine.


Met vriendelijke groet, Stynus ||| www.elektronicastynus.be
dannymyron
Lid
Berichten: 46
Gepost op maandag 5 April 2010 15:38:03 QuoteWijzig

[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]

snuggels
Lid
Berichten: 24
Gepost op donderdag 8 April 2010 19:34:13 QuoteWijzig

Ik heb het geprobeerd, maar er komt alleen 23:59:55 op het display en dat was het!

Ik ben het even kwijt.

dannymyron
Lid
Berichten: 46
Gepost op donderdag 8 April 2010 22:39:28 QuoteWijzig

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

snuggels
Lid
Berichten: 24
Gepost op donderdag 8 April 2010 23:27:55 QuoteWijzig

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]

dannymyron
Lid
Berichten: 46
Gepost op donderdag 8 April 2010 23:45:18 QuoteWijzig

als je mijn programma probeert zonder dat je er iets
aan wijzigt of bijplaats zie je de klok dan werken ?

snuggels
Lid
Berichten: 24
Gepost op vrijdag 9 April 2010 16:36:29 QuoteWijzig

@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?

Stynus
Admin
Berichten: 2850
Gepost op vrijdag 9 April 2010 16:51:47 QuoteWijzig

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
[1] 2 »

Active Topics

» De tuin.
» De gevolgen van een kl...
» Afstandsbediening plaf...
» Virtual Chemist probleem
» Probleem met Toyota Av...
» Whirlpool kookplaat
» 24 volt motor vertrage...
» Show je mini projecten
» Purer 8.3se
» MULTIMETERS geven alle...

» Meer actieve topics

Advertenties

ElektronicaStynus

© 2004-2022 SchemaTheek
Laadtijd: 0.3951 sec.