Sida 1 av 1

Mayday! AVR problem!

Postat: 22 mars 2012, 17:54:10
av Icecap
Nu är det problem! Har fått harva i ett gammalt projekt som visade sig vara "intressant".

Win7, 32 bit
AVR Studio 4.18, build 684.
GCC toolchain
ATmega88
AVRISP mkII
10MHz kristall
Fuses: SPI enabled, Ext. crystal, full swing. Ingen andra fuse-funktioner är aktiverade.

Vad ska enheten göra?
Den ska läsa lite data från UART och presentera dom på 3 st 7-segment LED.

Status:
Timer-interrupt fungerar!
Har inte kommit till UART'en än.

I min enfald antog jag att det var ganska enkelt, det fanns en mjukvara som borde ha fungerat sedan tidigare men pga. att folk har avslutat sin anställning osv. är all versionskontroll och kommentarer otroligt dimmiga. Hela enheten är byggt efter ett foto, inget schema finns. Alltså ska jag mer eller mindre uppfinna hjulet igen...

Hårdvaran var bristfällig, det är experimentkort, VDD var inte dragit ut till ICSP-kontakten och inte heller till AVCC men det har jag avklarat.
Avkopplingen var synnerligt bristfälligt också, även det har jag avklarat.

Scanningen fungerar skapligt men det är något knasigt i hela setup'en eller något.

Koden kompileras utan fel eller varningar, en HEX-fil skapas och jag kan bränna in den utan problem och den gör det jag ber den om - nästan! Och det är "nästan" som håller på att driva mig till vansinne...

Kod: Markera allt

volatile uint8_t Digits[3]; // The 3 digits scanning buffer. Contains bitpattern för applicable digit
uint8_t Digit_Pattern[10] PROGMEM = { ... 10 bytes med bitmönster för siffrorna '0' - '9'...};
uint8_t Digit_Sel[3] PROGMEM = {0b00000001, 0b00000010, 0b00000100};
uint8_t Digit_Ctr;

SIGNAL (SIG_OUTPUT_COMPARE1A)
  {
  // Turn off all LED digits and rows first to avoid ghosting
  PORTB =  PINB & PORTB_BLANK;
  PORTC =  PINC & PORTC_BLANK;
  if(++Digit_Ctr > Digit_2) Digit_Ctr = Digit_0; // Count the digits scanning, something must take time to avoid ghosting so why not this?
  // Turn on segments
  PORTB = (PINB & PORTB_BLANK) | (PORTB_DIGIT_BITS & Digits[Digit_Ctr]);
  PORTC = (PINC & PORTC_BLANK) | (PORTC_DIGIT_BITS & Digits[Digit_Ctr]);
  // Turn on digit-select
  PORTB = PINB | pgm_read_byte(&(Digit_Sel[Digit_Ctr]));
  }
Såklart initieras de olika enheter och den delen har jag inte pillat på.

Frågor som finns:
1: Ska man göra på något speciellt sätt i projektet när man bygger det? Alltså minnesinställningar, stack osv?
2: Ska man läsa på ett annat sätt när man vill indexera RAM? Alltså om jag vill läsa PORTC = Digits[Digit_Ctr]; ???
3: Ska RESET/MCLR ha en pull-up eller räcker det med den interna? Då jag startade den utan att AVRISP'en var på verkade den död.
4: Jag har inte hunnit lusläsa databladet men rakt av: finns det speciella saker man ska komma ihåg när man använder PORTB och PORTC?

Åh, vad det grämer mig att de inte har använd det mönsterkort som jag ritade till detta i sin tid - men det dög inte, det satt en PIC på! Det skulle vara AVR och en systemvetare till att programmera. *suck*

Re: Mayday! AVR problem!

Postat: 22 mars 2012, 18:46:29
av SvenW
Knepiga frågor. Bara direkt ur minnet, dvs. kan ha fel, vill jag svara så här:
1. Tror inte det är något speciellt utöver att avbrottsrutinerna
skall deklareras rätt. Har man inga speciella attribut skall det gå bra.
2. Ser ut att vara Ok
3. RESET/MCLR bör ha en extern pull-up plus kondensator.
4. Tror inte det finns något speciellt att tänka på med PORTB och PORTC?

Re: Mayday! AVR problem!

Postat: 22 mars 2012, 18:47:25
av AndLi
1. Det beror ju självklart på vad du vill göra hur stor stack du behöver osv, men för att få plats med den enda kod du har vissat oss så funkar standard
2. Vad står det i manualen som får dig att tro att det inte ska gå?
3. Vad rekomenderar databladet? 10 k till vcc kan jag hjälpa dig med ;)
4. Varför har du inte det? Kapitlet om port IO är inte direkt långt.. Du inser att detta inlägg har gjort det omöjligt för dig att pika andra TS om att de inte ger tillräckligt med information i sina inlägg va?? Och ge någon en RTFM... :)

Re: Mayday! AVR problem!

Postat: 22 mars 2012, 18:50:55
av thepirateboy
Reset har ca 50k intern pullup på Atmega, dock är det bra med en konding till jord för att filtrera bort ev. skräp.

Läsa port gör du med PINx, t ex PINC, eller vad menar du ?

Inställningar för projektet har du i makefilen, normalt behövs inga ändringar göras.

Så länge du har initierat portarna med DDRx så ska det inte vara några problem. Dock kan ju andra periferienheter
ta över portens I/O-funktioner, men det får man såklart hålla koll på själv.

Re: Mayday! AVR problem!

Postat: 23 mars 2012, 11:00:04
av Icecap
OK, nu har jag avsevärd mer kött på benen.

* Kod och schema stämde inte överens. Eller rättare: då det inte fanns schema alls är det mer frågan om att den fysiska kopplingen fick dekodas först.
* Koden är till en enhet med inverterat bitmönster, denna enhet har INTE det.
* Dåliga lödningar gav glapp.

Men nu är jag på banan och har fått den att faktisk (till stor del) göra som den får veta! Lite småpyssel kvarstår dock men jag har "vunnit" än så länge.

Men tack för att jag fick undanröjd tvivel.