Problem z atmel attiny85

Problem z atmel attiny85

OdgovorNapisal/-a 404Blaz » 16 Mar 2017, 23:58

Zdravo!
Pišem program za krmiljenje led diod za attiny in imam problem z ADCjem. Koda je tale:
Koda: Izberi vse
/*
 * OglasnaV1.c
 *
 * Created: 15.3.2017 20:07:27
 * Author : Blaz
 */

#include <avr/io.h>
#include <util/delay.h>

#define BOARD USER_BOARD

#define  F_CPU 8000000

int read_adc(void);
void init_pwm(void);

ADC_Init()
{
   ADMUX =
   (1 << ADLAR) |   // left shift
   (0 << REFS1) |   // Reference voltage is VCC
   (0 << REFS0) |   // Reference voltage is VCC
   (0 << MUX3)    |   // ADC 2 for port PB4
   (0 << MUX2)    |   // ADC 2 for port PB4
   (0 << MUX1)    |   // ADC 2 for port PB4
   (0 << MUX0);   // ADC 2 for port PB4
   
   ADCSRA =
   (1 << ADEN)  |   // Enable ADC
   (0 << ADATE) |  // Auto trigger disabled
   (0 << ADIE)    |   // ADC interrupt disabled
   (1 << ADPS2) |   // set prescaler to 128
   (1 << ADPS1) |   // set prescaler to 128
   (1 << ADPS0);  // set prescaler to 128
   
   DIDR0 = (1 << ADC2D);  //Digital input disable
}

void Init()
{
   DDRB |= 0x04;
}

int main(void)
{
   Init();
   ADC_Init();
    int adc = 0;
   
   while (1)
    {

//       PORTB = 0x04;      
//       _delay_ms(750);
//       PORTB = 0x00;
//       _delay_ms(750);
            adc = read_adc();
//       _delay_ms(20);
      if (adc > 128)
      {
         PORTB = 0xff;
         
      }
      if (adc < 128)
      {
         PORTB = 0x00;
      }
    }
}

int read_adc(void)
{
   ADCSRA |= (1 << ADSC);   // start ADC measurement
   while(ADCSRA & (1 << ADSC));   // Wait till conversion is complete
   return ADCH;   // return ADC value
}

void init_pwm(void)
{
   // initial OCR1A value
   OCR0A = 0x80;
   
   TCCR0A =
   (1 << COM0A1)  |
   (0 << COM0A0)  |
   (0 << COM0B1)  |
   (1 << COM0B0)  |
   (0 << WGM01)   |
   (1 << WGM00);
   
   TCCR0B =
   (0 << WGM02)  |
   (0 << CS02)     |
   (0 << CS01)     |
   (1 << CS00);
   
   TIMSK =
   (1 << OCIE0A);
}


problem imam tam ko preberem vrednost adcja in če je vrednost manjša od 128 mi ledice prižge drugače so ledice ugasnjene. ne vem kaj je narobe ker meni ledice skozi svetijo.
404Blaz
 
Prispevkov: 3
Pridružen: 08 Mar 2017, 17:16
Zahvalil se je: 1 krat
Prejel zahvalo: 0 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 0

Re: Problem z atmel attiny85

OdgovorNapisal/-a radix » 17 Mar 2017, 00:03

Ali so ledice vezane med Vcc in izhode PORTB? Ker kar ta koda tukaj dela je, da v zanki postavlja PORTB na 0 in to je to...
radix
 
Prispevkov: 897
Pridružen: 04 Feb 2015, 20:19
Kraj: Ljubljana
Zahvalil se je: 154 krat
Prejel zahvalo: 185 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 15

Re: Problem z atmel attiny85

OdgovorNapisal/-a 404Blaz » 17 Mar 2017, 01:02

Našel napako.
Problem je bil ker imam ledice samo na pinu PB2 ne pa na vseh pinih. Na drugih pinih imam še timer ki ga rabim za PWM.
Imam pa sedaj nov problem :D In sicer zakaj mi pri polni svetlobi ledice ševedno svetijo? Jaz bi pa rad da so ugasnjene?
Koda: Izberi vse

   
    while (1)
    {
      adc = read_adc();
      //_delay_ms(20);
      for (led_pwr = 0; led_pwr <= 255; led_pwr++)
      {
         if(led_pwr < adc)
         {
            PORTB = (1 << PB2);
         }
         else
         {
            PORTB = (0 << PB2);   
         }
         _delay_us(50);
      }
      
    }
}

int read_adc(void) {
   ADCSRA |= (1 << ADSC);         // start ADC measurement
   while (ADCSRA & (1 << ADSC) ); // wait till conversion complete
   return ADCH;               // return ADC value   
}

404Blaz
 
Prispevkov: 3
Pridružen: 08 Mar 2017, 17:16
Zahvalil se je: 1 krat
Prejel zahvalo: 0 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 0

Re: Problem z atmel attiny85

OdgovorNapisal/-a forest70 » 17 Mar 2017, 08:37

Napaka, ki jo počneš je ta:
Koda: Izberi vse
PORTB = (1 << PB2);


To se ne počne tako.Tu postaviš vrednost PORTB, ki sledi iz izračuna in pobrišeš vse ostale bite, ki imajo drugo funkcijo.

Koda: Izberi vse
PORTB |= (1 << PB2);

S to kodo pa postaviš samo dotični bit v PORTB

Koda: Izberi vse
PORTB &=  ~(1 << PB2);

S to kodo pa zbrišeš samo dotični bit v PORTB
Uporabniški avatar
forest70
 
Prispevkov: 1044
Pridružen: 14 Jan 2015, 01:11
Kraj: Koper
Zahvalil se je: 247 krat
Prejel zahvalo: 228 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 107


Vrni se na C in sorodni jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost