Re: Avr studio, atmega32 - neodhalitelný problém ?

Miroslav Šinko sinkomiro@gmail.com
Středa Duben 15 01:04:14 CEST 2009


Len par poznamok, mozno ani nie k veci v suvislosti s tym, co ste
pisali o inom kuse MCU. Ale snad pre buducnost :-)

-BODLEVEL: v datasheete sa pise "BODLEVEL = 1 is not applicable for
ATmega16.", v kontexte toho, ze je mega16 a mega16L. Ako presne mate
BODLEVEL nastavenu a aku megu16(x) mate?

-pouzivate vyraz "segment" vo vyzname 7-segmentovka, co je trochu
matuce. Segment je ta 1 palicka z cislice (plus bodka), oznacena
a,b,c,d,e,f,g,h.

-k asm vazne pouzivajte "volatile", lebo asm("nop"); kompilator pri
akejkolvek optimalizacii vynecha

miro

PS: a ako teda s tymi napajacimi pinmi?

2009/4/14, Bear John Grills <bear.j.grills@gmail.com>:
>
> >> Vse jsem zkousel.. s tim asm("sbi ...") jeste ten den. Porad to delalo
> >> to same. Na osciloskopu jsem meril, ihned jak to neslo, nic.
> >>
> >
> > Co je to "nic"? Tmava obrazovka?
> >
> > Co tak skusit popisat problem ako inzinier? Vacsina z nas nie su jasnovidci.
> >
> >
> Signal pro rozsviceni segmentovky napojen pres rezistor na bazi
> tranzistoru "lital" na log.1 pouze na tom pinu, ktery byl definovan jako
> prvni (int display_i =1;)
> >> [...] vyzkousel jsem snad vsechno.
> >>
> >
> > To asi tazko...
> >
> Uznavam ze vsechno opravdu ne :)
> >> A ted tresnicka na zaver. Funguje to jak má, .. ale pouze pokud ten
> >> procik má na sobì 4,2V +-0,2V .. je to naprosto ¹ílené anomální chování.
> >>
> >
> > Co je to "ma na sobe"? Hovorite o napajacom napati?
> > Ak ano, tak to poukazuje na hardwarovy problem - poobzeral by som sa po skratoch, bordeli v napajani, chybne pozapajane napajacie piny (vratane analogovych).
> >
> Ano, hovorim o napajecim napeti. Odpuste spatny popis.
> >> Migruji na AT91SAM7XC256. Zlatý Keil ... mam na to i ulink, vidím, co se
> >> tam deje, a ne, ze do atmegy nasypu cosi po SPI a neni do toho videt, i
> >> kdyz debugger rika, ze to jit ma, nejde to.
> >>
> >
> >
> > Debugger je nastroj, a to jeden z N, a nie spasa.
> >
> Omlouvam se za prehnana silna slova.
>
> Pokračování tajuplného příběhu:
> Sám sobě na "truc", jsem jel ke kamarádovi pro jiný smd atmega32. Tu
> původní, jsem vypájel, dal jsem tam tuto. A -- vše najednou bez
> problémů! Nedalo mi to, dal jsem tam ten původní.. a původní problém se
> znovu projevil.. Nevím, nedokážu si představit, že by nějaká hardwarová
> chyba, v IO, měla za důsledek takovéto chování.. podotýkám, že oba
> procesory byly nastaveny, včetně fuse bitů, naprosto autenticky. Že by
> byl problém v flash.. ponyprog vždy vše verifikoval ok.
>
> Ted uz spis jentak pro zajimavost...
>
> fusebity - zminuju ty co jsou nastaveny.
> OCDEN, JTAGEN, CKOPT, BODLEVEL, BODEN.
> Oscilator - external clock signal 8Mhz.
>
> Zdrojovy kod..
> Abych popsal HW,
> k PD4 PD5 PD6 je pripojen 74HC164 ktery ridi led v segmentech
> na PORTA dle konfigurace jsou rozsveceny jednotlive segmenty
>
>
>
> #include "avr/io.h"
> #include <avr/interrupt.h>
> #include <stdio.h>
>
> // posuvny registr pro data displeje 74HC164
> #define display_data_port PORTD
> #define display_data_ddr DDRD
> #define display_data_shift_clock PD4
> #define display_data_shift_reset PD5
> #define display_data_shift_data PD6
> // vyber segmentu k zobrazeni (segmenty jsou na pinu zapojeny vedle sebe)
> // levy segment ma nejvyssi cislo
> #define display_segment_port PORTA
> #define display_segment_ddr DDRA
> #define display_segment_offset 0 // offset na portu
> #define display_segment_count 3 // pocet segmentu
> #define display_segment_mask 0x7 // maska pro pocet segmentu (kolik
> segmentu tolik jednicek vedle sebe)
>
> // fce pro konverzi cisla na hodnotu pro display podle tabulky
> // pozn.. nektere cislice jsou spatne
> int digit_conv(int digit) {
> int result;
> switch(digit)
> {
> case 0x1: // 1
> result = 0x6;
> break;
> case 0x2: // 2
> result = 0xF2;
> break;
> case 0x3: // 3
> result = 0x4F;
> break;
> case 0x4: // 4
> result = 0x33;
> break;
> case 0x5: // 5
> result = 0x6D;
> break;
> case 0x6: // 6
> result = 0x7D;
> break;
> case 0x7: // 7
> result = 0x7;
> break;
> case 0x8: // 8
> result = 0x7F;
> break;
> case 0x9: // 9
> result = 0x6F;
> break;
> case 0x0: // 0
> result = 0x3F;
> break;
> default: // other
> result = 0;
> break;
>
> }
> return result;
> }
>
> // fce ktera resetuje posuv. registr
> void display_data_reset(void) {
> display_data_port &=~ (1<<display_data_shift_reset); // reset 0
> asm("nop");
> display_data_port |= (1<<display_data_shift_reset); // reset 1
> asm("nop");
> }
>
> // fce pro vystaveni dat na posuvnem registru
> void display_data_bus_set(unsigned int data) {
> int i;
> int temp;
>
> display_data_reset(); // reset
>
> for(i=0;i<=7;i++) {
> temp = (data >> i) & 0x1;
> if(temp==0x1) {
> display_data_port |= (1<<display_data_shift_data);
> } else
> {
> display_data_port &=~(1<<display_data_shift_data);
> }
> asm("nop");
> display_data_port |= (1<<display_data_shift_clock); // clock 1
> asm("nop");
> display_data_port &=~ (1<<display_data_shift_clock); // clock 0
> asm("nop");
> }
> }
>
> // promenne
> volatile int display_segment_pointer = 1; // cislo ukazujici na vybranou
> segmentovku
>
> // start programu
> int main() {
> // inicializace portu pro display
> // konfigurace pro 74HC164
> display_data_ddr |=
> (1<<display_data_shift_clock|1<<display_data_shift_reset|1<<display_data_shift_data);
> // vystup
> display_data_port
> &=~(1<<display_data_shift_clock|1<<display_data_shift_reset|1<<display_data_shift_data);
> // vse na nulu pro jistotu
> display_data_port |= (1<<display_data_shift_reset); // reset na jednicku
> (odresetovani)
> // konfigurace portu pro vyber segmentu
> display_segment_ddr |= (display_segment_mask<<display_segment_offset);
> // vystup
> display_segment_port &=~(display_segment_mask<<display_segment_offset);
> // vse na nulu pro jistotu
> // nastaveni timer0 jako overflow pro obnovovani displeje
> TCNT0 = 0x00; // pocatecni hodnota timer counteru (pro jistotu)
> TCCR0 |= 0x04; // prescaler
> TIMSK |= 1<<TOV0; // TC0 overflow zapnuto
> sei(); // globalni povoleni preruseni
> // smycka
> display_data_bus_set(digit_conv(5));
> while(1) {
> asm("nop");
> asm("nop");
> }
> }
>
> ISR(TIMER0_OVF_vect) // TC0 overflow
> {
>
> /** zoufalecky pokus
> PORTA &=~(0x7);
> if(display_i==0) {
> PORTA = 0x1;
> display_i = 1;
> }
> else if(display_i==1) {
> PORTA = 0x2;
> display_i = 2;
> }
> else if(display_i==2) {
> PORTA = 0x4;
> display_i = 0;
> }
>
> **/
>
> // nejdrive se provede reset posuv. registru
> display_data_reset();
> display_data_bus_set(digit_conv(5)); // (5 - testovaci)
> // dame nuly na vyber segmentu
> display_segment_port &=~(display_segment_mask<<display_segment_offset);
> asm("nop");
> // 0x1 posuneme o aktualni cislo(pointer) vybraneho segmentu + offset
> display_segment_port |=
> ((0x1<<display_segment_pointer)<<display_segment_offset);
> asm("nop");
> display_segment_pointer++; // inkrementace segment pointeru
> if(display_segment_pointer==display_segment_count) { // pokud se rovna
> poctu segmentu(resp. jsou znaceny od nuly, takze realny pocet segmentu
> je o jedno vyssi nez nejvyssi segment pointer), vynulovat
> display_segment_pointer=0;
> }
>
> TCNT0=0x00;
> }
> */
>
>



Další informace o konferenci Hw-list