Probleem met Picbasic, Serial Interrupt en Port HIGH/LOW

Hai COers,

Ik ben bezig met een controller te ondwerpen / bouwen, op zich zelf gaat dit uitstekend, maar nu de vraag.

Via RS232 commando 's kan ik de controller besturen en configureren via de PC, ook dit gaat helemaal goed.

Nu het volgende, wanneer ik uitgangen dus via een PC commando probeer uit te schakelen, word soms wel en soms niet de betreffende uitgang laag.

pic basic code:


            If RS232_BUFF = "#INT=OFF#" Then                
                
                While TMR0IE = 1
                    TMR0IE = 0
                Wend
                
                RS232_INT_TIMER = 10
                                        
                DelayMS 5
                RS232_OUT_Start = 1                                
                Out_MF_0 = 0
                DelayUS 5
                Out_MF_1 = 0
                DelayUS 5
            endif

De RS232 afhandeling vind plaats binnen de USART HIGH interrupt routine.

In deze functie moet dus de Timer interupt gestop worden, gaat goed.
Paar variabelen moeten een waarde krijgen, gaat ook goed.

Maar nu; een aantal uitgangen, (Out_MF_0 en OUT_MF_1) moet laag worden, soms gaat dit goed maar soms ook niet.

Ook low .... geeft hetzelfde probleem

O, ja ik gebruik proton picbasic.

Alvast vriendelijk dank,
Stan

Read the fuc.... manual and read the fuc.... datasheet! {Proton IDE: V2.0.1.2 / Proton Compiler: V3.5.4.5}

We krijgen maar een klein stukje code te zien, dus het blijft gokken.
Blijkbaar gebruik je een timer om je RS232 interrupt mee te sturen. Of 10 veel is of weinig weet ik niet.
Dan ga je delayen, niet veel, maar toch...delayen in interrupts is een beetje heel erg vloeken in de kerk.
Volgens de code zouden Out_MF_0 en 1 laag moeten worden.

Bij het ingaan van de interrupt handlers worden alle interrupts tegengehouden. Dus in principe zou dit zomaar moeten werken.

Het feit dat ze niet laag worden gemaakt kan ook worden veroorzaakt door 'iets' dat ze hoog maakt.
Maar aangezien we niet zien waar/wanneer deze twee hoog worden gemaakt blijft het in de glazen bol turen.

Just find out what you like and let it kill you

Hoy,

Het programma is behoorlijk groot, meer dan 32KB!
Dus dat kan ik niet even posten, ik maak gebruik van een 18F4585.

Ik maak dus gebruik van 2 interupts, een LOW (8bits timer) en een High (Serial RX) interupt.

De Out_MF_ uitgangen worden zonodig ALLEEN in de timer module hoog of laag gemaakt.

De delays heb ik hier geplaatst o te kijken of dat dan wel de uitgangen altijd laag gemaakt worden, helaas dus zonder resultaat

De timer interupt word hier:

While TMR0IE = 1
TMR0IE = 0
Wend

Uitgezet en ook dit gaat goed, Het aantal interupts word in de timer interupt (acties) per seconden geteld, en na deze instruktie staat deze keurig op (0) en daarvoor op (100)

Wanneer ik via de PC de instructie "#INT=ON#" verzend krijg ik weer keurig (100) interupt(acties) per seconden. Dus het uit en in schakelen van de Timer interupt gaat goed EN
deze uitganen worden nergens anders hoog gemaakt, dus kan het alleen maar betekenen dat soms de uitgang niet laag gemaakt word in de Usart interupt routine.
Maar dit gebeur alleen niet altijd.

Read the fuc.... manual and read the fuc.... datasheet! {Proton IDE: V2.0.1.2 / Proton Compiler: V3.5.4.5}

Op 24 februari 2011 19:08:23 schreef Stan1:
Het programma is behoorlijk groot, meer dan 32KB!
Dus dat kan ik niet even posten, ik maak gebruik van een 18F4585.
...
De Out_MF_ uitgangen worden zonodig ALLEEN in de timer module hoog of laag gemaakt.

Upload archief.

Dus dat stukje code komt uit de timer interrupt?
En dat is een LOW interrupt, dus het kan zomaar gebeuren dat de HIGH interrupt de LOW interrupt niet aan het woord laat.

Just find out what you like and let it kill you

Op 24 februari 2011 19:23:29 schreef hadv:
Dus dat stukje code komt uit de timer interrupt?
En dat is een LOW interrupt, dus het kan zomaar gebeuren dat de HIGH interrupt de LOW interrupt niet aan het woord laat.

Neen, dit stukje komt uit de USART interupt.

Wanneer ik dus met de PC,de volgende text verstuur:
#INT=OFF# word er dus gesprongen naar de High interrupt routine en word dus eerst dus de timer interupt uit gezet:

While TMR0IE = 1
TMR0IE = 0
Wend

Daarna worden de Out_MF_ laag gemaakt (altans dit zou moeten gebeuen)

Doordat de Timer interupt uit geschakeld is, kunnen deze uitgangen niet hoog gemaakt worden.

En toch worden deze uitgangen niet (altijd) laag gemaakt?????

Read the fuc.... manual and read the fuc.... datasheet! {Proton IDE: V2.0.1.2 / Proton Compiler: V3.5.4.5}