Vis indlæg

Denne sektion tillader dig at se alle indlæg oprettet af dette medlem. Bemærk at du kun kan se indlæg der er oprettet i områder du i øjeblikket har adgang til.


Beskeder - jascore

Sider: 1 2 [3] 4 5 ... 11
31
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 21, 2011, 18:53:39 »
Du er genial.
Nu sker der da noget.
hvis jeg smider toggleLED1(); ind lige efter sSeconds++;
så slukker led når jeg trykker på start. og så sker det fantastiske at led tænder igen efter x antal sek. nogle gange. andre gange bliver led lidt skarpere lige når der trykkes  :P

men forsinkelsen er altid mellem 10 og 26 sek og startknappen kan derefter aktiveres igen og enten gøre led skarpere eller slukke den i x sek. for det meste omkring 15 sek

32
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 21, 2011, 17:54:43 »
Citér
Hvad ville den maksimale værdi af adcCounter så være ?
vil den ikke være 7 med mindre den hedder <=

Citér
while(adcCounter < 8)
    {
    }

der sker vel ingen ting. er den under 7 udføres det intet. er den over 7 springes while over og der sker intet alligevel
eller fryser den i løkken

33
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 21, 2011, 17:34:26 »
den lyser hele tiden når jeg prøver det du har skrevet.
kan ikke se forskel på om den er svag eller skarp. men
hvis jeg sætter led til at være slukket i toppen og undlader at tænde den i bunden, forbliver den slukket. hvis jeg slukker den i starten af interrupt tænder den i bunden forbilver den tændt
if (adcCounter ==#)
{
setLED1(0);
}
hvor # er 1-8 og den slukker som den skal og stopper ved 9 med at slukke


sorry. jo den bliver svag, så interrupt må køre
trykker jeg så på startknappen, slukker den helt


34
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 21, 2011, 16:05:44 »
i flg
if(ADCSRB & (1 << ADLAR))                                          /* check hardware alignment-configuration and act accordingly */
      {
         adLo = 0;
         adHi = inb(ADCH);                                             /* (read highbyte only) */
      }
      else
      {
         adHi = 0;
         adLo = inb(ADCH);                                             /* (read highbyte only) */
      }
reagerer den ikke med en setLED i if, kun i else
og i den overordnet funktion if(adcBits <= 8)
reagerer den ikke i else

men under alle omstændigheder er det efter med gSettings = calculateSettingsDip(getADC1Value()); kaldet i startdosing funktionen at systemet stopper

35
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 21, 2011, 15:50:46 »
Med en toggleLED inde lige efter adcCounter++; toggler den ikke led med mindre at det går så hurtigt at jeg ikke kan se det
Med en setLED1(0) slukker den godt nok der inde



36
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 21, 2011, 14:42:13 »
Citér
Så prøv at flytte startDosing() fra initDosing over i Main.c, lige efter sei();

Det virkede desværre ikke den hænger stadig i waitUntilADCStable().
når jeg bruger setLED1(0); i den første getADC1Value slukker den godt nok, men ikke i de efterfølgende 2 getADC#Value
uint16_t getADC1Value()
{
   return(getADCValue(1));
}

uint16_t getADC2Value()
{
   return(getADCValue(2));
}

uint16_t getADC3Value()
{
   return(getADCValue(3));
}

37
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 20, 2011, 22:24:15 »
Så er jeg igang igen.
Har lavet alle ændringer som du skrev og brugt de nye led.c og h, og har ikke nogle toggleled() eller setLed(#) nogle andre steder i koden.
og det her er en kedelig mail der bare beskriver hvordan jeg går frem, ligeså meget for min egen skyld, så jeg prøver at være systematisk i min fejlsøgning  :o
Når jeg starter systemet op lyser alle dioder pa4-7.

så prøver jeg at skrive
Kode:
setLED1(0);
setLED2(0);
setLED3(0);
setLED4(0);
lige efter initled() i main så slukker alle led (det gør de ikke hvis jeg først skriver dem efter eks sei)
apropos SEI. skal den stå 2 steder. kan det ikke skabe problemer at enable interrupts 2 steder?

så men efter de alle er slukket, smider jeg setLED1((SREG >> 7) & 1); ind i main's while løkke og alt er stadig slukket så væk med den igen.
prøver at smide en toggleLED1(); ind i startknap funktionen efter prell sikring, og intet sker. stadig slukket.

prøver en setLED1(1) samme sted stadik slukket

fjerner alle setLED#(0) og smider toggle led ind i startknap funktionen igen og ser hvad der sker. Alt lyser og intet toggler. prøver også lige setLED1(0). ingen reaktion

Prøver at skrive PINA = (1 << PA4); alt lyser fortsat når der trykkes på start.
Smider alle setLED#(0) ind igen og prøver med samme toggle alle leds er nu bare slukket  :-[
gør jeg noget forkert her?

Fandt ud af noget interessant. Jeg kan bruge setLED#(0) før initdosing i main.c men samme komando virker ikke efter initdosing
så det må vel betyde at den hænger i init af dosing et eller andet sted

Så søgte videre ved at følge programmet.
den går til initdosing hvorfra den går til startdosing og setLED#(0) komandoen virker indtil gSettings = calculateSettingsDip(getADC1Value()); efter denne kommando virker det ikke mere så søger videre derfra
Gennem hele uint8_t calculateSettingsDip(uint16_t gDipSwitches) virker det også men så tænker jeg
i startdosing sætter den gSettings = calculateSettingsDip(getADC1Value()); men  calculateSettingsDip funktionen hedder calculateSettingsDip(uint16_t gDipSwitches) det stemmer jo ikke overens, så prøver at ændre i startdosing så det er gSettings = calculateSettingsDip(uint16_t gDipSwitches istedet for gSettings = calculateSettingsDip(getADC1Value());
og det kunne jeg ikke.
så må jeg jo kigge videre i getADC1Value() og se hvad der sker der

den slukker led gennem hele uint16_t getADCValue(uint8_t aADC) men i void waitUntilADCStable() slukker den ikke noget
i funktionen uint16_t getADC1Value() slukker den for led men ikke i de 2 efterfølgende
uint16_t getADC2Value() og uint16_t getADC3Value()
og nu vil jeg stoppe for i dag og hoppe i seng  8)

38
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 20, 2011, 01:26:41 »
Hmm nej. jeg forstår det ikke.
hvis jeg har prescaler 8 i TCCR0B kan jeg godt toggle leds ved tryk på start knap, og følge det helt hen til start dosing. men den vil ikke toggle pr. sek i timeren.
sætter TCCR0B prescaleren til 64 som den skal kan jeg tænde og slukke dem med en setLED(1) eller 0 i main lige efter init led, men reagerer ikke på noget med toggle eller on eller off  hvis jeg smider det ind i startknap funktionen ??
Til gengæld kan jeg se at den springer direkte over i startdosing i dosing.c uden at jeg trykker på knappen for der kan jeg kode leds til at tænde eller slukke men stadig reagerer de ikke på startknappen

Efterfølgende har jeg fået 1 led til at toggle ved tryk på start, med prescaler 64, men den lyser stadig konstant hvis jeg smider toggle ind efter sSeconds++

tror også jeg fandt en anden fejl.
når der trykkes på start kaldes startdosing rutinen, men den har jo ingen adc1 værdier at forholde sig til så ved ikke om  flg skal ind i startknap rutinen lige inden startdosing bliver kaldt
gSettings = calculateSettingsDip(getADC1Value());

39
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 19, 2011, 23:12:25 »
super. fantastisk.
prøver det fluks


Man skulle næsten tro at min avr er brændt af eller noget. når jeg sætter prescaler til det som du sagde, så lyser alle leds hvad enten jeg sætter dem til off eller ej ?!?!  :-[

40
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 19, 2011, 20:26:08 »
 :)
men den toggler desværre ikke hvert sek. den lyser bare konstant det betyder vel at timeren ikke kører som den skal  :o

41
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 19, 2011, 20:13:42 »
tusind tusind tak  :P

42
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 19, 2011, 17:52:20 »
Det vil jeg gøre. tusind tak.

lige et spørgsmål mens jeg pakker og sender.
er der en hurtig måde man kan toggle et led så den tænder og slukker hver gang sekund skifter ? noget bit shift eller noget

43
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 19, 2011, 16:41:51 »
gg så prøver jeg lige den her istedet
GIMSK  |= (1<<PCIE0);

Hvis GIMSK kun har 3 muligheder int0 PCIE1 og PCIE0 hvorfor melder compiler så ikke fejl når jeg skriver andet.

WEEEEEEEE der sker noget. men den mangler at registrerer led 3. men den tænder godt nok led 4 i startDosing();   (dog ikke altid. men 90% af gangene) og altid 2. gang hvis ikke første

pinValue = PINA & (1 << PINA3);
if(pinValue)
          {
      setLED3(1);
      setLED2(0);                              /* turn LED1 off */
                startDosing();   
          }

44
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 19, 2011, 15:45:58 »
 :D
Citér
   GIMSK  |= (1<<PCINT3);
Se side 50 i databladet. :)
Derefter se side 52.

(Den slags har jeg selv haft meget bøvl med, [fnis])

skal GIMSK hedde
GIMSK  |= (1<<PCINT0);
og er ikke helt sikker på om SREG er noget jeg skal sætte op?

45
Generel Elektronik / Sv: hjælp til servo kontrol med timer
« Dato: November 18, 2011, 23:30:01 »
kan jeg gøre flg.
lave en led.c med flg
Kode:
void setLED1(uint8_t aState)
{
    PORTA = aState ? (PORTA & ~(1 << PA7)) : (PORTA | (1 << PA7));
}
void setLED2(uint8_t aState)
{
    PORTA = aState ? (PORTA & ~(1 << PA6)) : (PORTA | (1 << PA6));
}
void setLED3(uint8_t aState)
{
    PORTA = aState ? (PORTA & ~(1 << PA5)) : (PORTA | (1 << PA5));
}
void setLED4(uint8_t aState)
{
    PORTA = aState ? (PORTA & ~(1 << PA4)) : (PORTA | (1 << PA4));
}

og en led.h med
prototypes på de 4 setLED1(uint8_t aState)

Så laver jeg en #include "led.h" i alle *.c
alt det lader jeg bare være en fast del af programmet, så det er der når og hvis der skal udvides

for at teste kan jeg så ikke bare redigerer i den *.c hvor der er noget jeg vil teste, og tilføje
Kode:
uin16_t val = det_der_skal_testes();
void toggleled()
{
uint16_t val = getADC2Value();
if(val >= 1)
{
setLED1(1);  /* turn LED1 on */
val = val - 1;
}
else
{
setLED1(0);  /* turn LED1 off */
}
if(val >= 2)
{
setLED2(1);  /* turn LED2 on */
val = val - 2;
}
else
{
setLED2(0);  /* turn LED2 off */
}
if(val >= 3)
{
setLED3(1);  /* turn LED3 on */
val = val - 3;
}
else
{
setLED3(0);  /* turn LED3 off */
}
if(val >= 4)
{
setLED4(1);  /* turn LED4 on */
val = val - 4;
}
else
{
setLED4(0);  /* turn LED4 off */
}
}

jeg har svært ved at se hvordan keg kan compile og teste 1 modul ad gangen da de alle er vævet sammen og er afhængige af værdier fra andre end sig selv

Når jeg gør det på den måde, ser det ud til at selve start knap funktionen ikke virker.
jeg kan tænde og slukke led 1 på pa7 ved at skrive setLED1(1); eller setLED1(0); i starten af main.c (som det sidste i init main) men hvis jeg skriver setLED1(1); nede i ISR(PCINT0_vect) funktionen så sker der intet når jeg trykker på start knappen. er dog ikke helt sikker på at min led rutiner er globale

Min main.c ser således ud
Kode:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "main.h"
#include <util/delay.h>
#include "Servo.h"
#include "ADC.h"
#include "Timer0.h"
#include "Dosing.h"
#include "leds.h"
int main()
{
    GPIOR2 = SERVO_ENABLED; /* This must be the first code executed; no code goes before it, and GPIOR2 is not to be changed from now */
initADC(8); /* initialize ADC, we'll use the 8-bit precision for now */
    initTimer0();
    initDosing();
    initServo();
sei(); /* globally enable interrupts */
    PCMSK0 |= (1<<PCINT3); /*Set PA3 as the pin to use*/
MCUCR = (1 << ISC01) | (0 << ISC00); /* interrupt on INT0 pin, falling edge */
GIMSK  |= (1<<PCINT3);
setLED1(1);
while(1)
{
/* we don't really need to do anything here. Everything is handled by the interrupts */
}
    return(0); /* (never reached) */
}
ISR(PCINT0_vect)
{
    uint8_t pinValue;
    pinValue = PINA & (1 << PINA3);                             /* read value of input-pin */
    if(pinValue) /* we're only interested if button is pressed */
    {
        _delay_ms(10.);                                          /* wait 10 ms */
        pinValue = PINA & (1 << PINA3);                         /* read value of input-pin */
        if(pinValue) /* only update settings when button value is stable */
        {
setLED1(0);  /* turn LED1 off */
            startDosing();   
        }
    }
}

Sider: 1 2 [3] 4 5 ... 11