Interrupt fel, Krets: ATMega32, Språk: C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Fixat punkten och de nu.

Tack för rättningen av koden :) ska testa snart :D hoppas att de funkar
Vad för storlek på kondingar föreslår du?
Något mer du ser som är konstigt i shemat?

förutom att knapparna är lite udda kopplat, de vet ja ;)

Edit: Matseng:

Jo, vet att det inte finns några pullup motstånd... ska ändra de.

Sen ett motstånd på anoden blir de ja. hehe, vet inte vad jag tänkte när jag rita de;)

Borra är kanske inte de roligaste här i världen, men jag har beställt allt nu, och har väl iofs inget annat att göra ;) Och så jäkla tråkigt är de inte. ;)
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

22p på ömse sida av kristallen till GND brukar vara standart.

Sen har du kopplat..... ööööhhhh .... annolunda ....

Men OK, det finns olika smakar, det fungerar med största sannolikhet men det är ett udda sätt.

Jag hade främst inte använd ett shift-register, jag hade tagit en 7-segment-dekoder-med-latch (t.ex. 4543) per siffer och matat data in med en 8-bitars port (low nipple -> ones, high nipple -> tens) och placerat drivspänningen så lagom att jag hade sluppit transistorer (om nixie-rörens tänd/släck-skillnad tillåter).

Detta hade givit mig att en uppdatering ville kräva 3 data-på-port-och-skaka-en-strobe.

Sen kan du spara R54 - R123 vid att koppla annolunda i det befintliga...
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Virr3: Du menar att ta bort alla 10 katodmotstånd och ersätta dom med ett anodmotstånd per rör va?
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Matseng>> jo... hehe ;)

Icecap>> Hur menar du med annolunda? ;)

Egentligen kvittar de, bara de funkar :)

Ang. de där med shiftregistret, så va de B1n4ry som förklarade de för mig, och de va inte så jätte krångligt att förstå hur de skulle kopplas upp och hur de funkade, så jag har kört på de...

hehe ;) Dock är ju programerandet en helt annan historia ;)

22p säjer du... jobbigt, har inga hemma :( men de funkar utan sa du? Bara så att jag vet att de funkar överhuvud taget så kan man ju beställa sen. Iofs kostar dom väl inte mer än några kronor.

Men klock-kristallen tar inte skada av att inte ha avkopllings kondingarna?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kondingerna är till för att ge den rätta belastningen på kristallen, samtidig ger de en sorts transformering av signalen så att kristalloscillatorn kan oscillera alls. Det är alltså inte frågan om avkopplingskristaller.

Nu kommer det nog många kommentarer typ: "men jag har ALDRIG kondingar och det kör minsann i alla fall!" och det kan vara rätt, det finns alltid strökapacitans som kan vara nog till att det fungerar på en bra dag och till och med på en normal dag men på en dålig dag?

Om det fungerar i normalfall utan kondingarna bör man fundera på sin kretskortritning, den har då tydligen en del onödiga strökapasitanser...

Sen håller du på med en klocka....och den bör ju gå hyffsat rätt vilket medför att kristallet ska belastas rätt....= kondingar.

På labbplatta brukar det fungera då de olika delar har en kapacitet gentemot varandra men det är bättre att ha kontroll på läget än att hoppas på det bästa.

Med 'annolunda' menar jag att du har vald en koppling som inte precis verkar logisk för mig men som du säger: om den fungerar då gör den ju det, om du hoppar på höger fot eller vänster kviter, bara du kommer fram ju!
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Icecap: Fast just i det här fallet (specifikt just för vissa AVR:er) så har nog Virr3 tänkt koppla en klockkristall (32768 Hz) till TOSC-pinnarna. Där sitter det inbyggda kondingar för att kunna driva klockkristaller.

For AVR microcontrollers with Timer/Counter Oscillator pins (TOSC1 and TOSC2), the
crystal is connected directly between the pins. No external capacitors are needed. The
Oscillator is optimized for use with a 32.768 kHz watch crystal. Applying an external
clock source to TOSC1 is not recommended.
(Databladet för Mega32)

Virr3: D1 är vänd åt fel håll.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

:) fixat dioden...

tyckte att de va lite knepigt, men det stog faktiskt i ett datablad te programeraren jag fixat fram:/ aja, sak samma. inget skadat änsålänge iaf ;)

men, koden funkar fortfarande inte :(

Vad tusan kan de va?

Mailat atmel och bett dom skicka en exempelkod på hur man får den asynkrona klockan att fungera med alla register å så. hoppas att jag kan få svar från dom snart. hoppas att jag får svar överhuvud taget. Det där med programering är väl inte deras grej, de tillverkar väl de bara. men ändå. Aja. kan ju inte skada iaf.

men, va tusan kan de va som är fel?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Tack cykze...

Har skrivit som dom gjort i den koden där. bara ändrat så att registrena blev rätt...

Kod: Markera allt

#include <avr/io.h>
#include <avr/signal.h> 
#include <avr/interrupt.h> 
#include <inttypes.h>
#include <avr/delay.h>
#include <compat/ina90.h>

uint8_t Htio = 0;//Variabler som behövs
uint8_t Hen = 0;
uint8_t Mtio = 0;
uint8_t Men = 0;
uint8_t Stio = 0;
uint8_t Sen = 0;

SIGNAL(SIG_OVERFLOW2)//interuppt triggas på overflow
  {
  PORTA |=  _BV(PA3); // OK, den tror jag på
  PORTA |=  _BV(PA0); // Samma här
  _delay_loop_1(10); // Öhhhh...delay i en interrupt????
  PORTA &= ~_BV(PA0); // Nåväl, någon anledning är det väl...
  if(++Sen >= 10) // Räkna upp sekund-ental
    { // Hoppla, 10 eller mer
    Sen = 0; // Nolla sekund-ental
    if(++Stio >= 6) // Räkna upp sekund-tiorna
      { // Hoppla, sekund-tiotal är 6 eller mer
      Stio = 0; // Nolla sekund-tiotal
      if(++Men >= 10) // Räkna upp minut-ental
        { // Oj då, mer än 9 minuter på entalen
        Men = 0; // Nolla minut-ental
        if(++Mtio >= 6) // räkna upp minut-tiotal
          { // Jaha...overflow här med...
          Mtio = 0; // Nolla den då...
          if(++Hen >= 10) // Räkna upp timme-ental
            { // Ojsan, det är mer än 9 timmer på entalen...det går inte
            Hen = 0; // Nolla timme-ental
            if(++Htio >= 2) Htio = 0; // Räkna upp timme-tiotal, om mer än 2 ska den nollas
            }
          }
        }
      }
    }
  } 

int main(void)
{


int temp0;
int temp1;

for(temp0=0; temp0<0x0040; temp0++)
{
	for(temp1=0;temp1<0xFFFF;temp1++);
}
DDRA=0xFF;
TIMSK &=~((1<<TOIE2)|(1<<OCIE2));
ASSR |= (1<<AS2);

TCNT2 = 0x00;
TCCR2 = 0X05;

while (ASSR&0x07);
TIMSK |= (1<<TOIE2);

_SEI();

while(1)
{
	MCUCR = 0xB0;
	_SLEEP();
	_NOP();
	TCCR2=0x05;
	while (ASSR&0x07);
}


	uint8_t a;
	uint8_t b;
	uint8_t c;
	uint8_t d;
	uint8_t e;
	uint8_t f;
	
	
	
	while(1)
	{	
		for(a=0;a>9;a++)
		{
			if(Htio==a)
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				PORTA |=  _BV(PA1);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA1);
			}
			else
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				_delay_loop_1(10);
			}
		}
		for(b=0;b>9;b++)
		{
			if(Hen==b)
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				PORTA |=  _BV(PA1);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA1);
			}
			else
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				_delay_loop_1(10);
				
			}
		}
		for(c=0;c>9;c++)
		{
			if(Mtio==c)
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				PORTA |=  _BV(PA1);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA1);
			}
			else
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				_delay_loop_1(10);
			}
		}
		for(d=0;d>9;d++)
		{
			if(Men==d)
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				PORTA |=  _BV(PA1);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA1);
			}
			else
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				_delay_loop_1(10);
			}
		}
		for(e=0;e>9;e++)
		{
			if(Stio==e)
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				PORTA |=  _BV(PA1);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA1);
			}
			else
			{
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
			   _delay_loop_1(10);	
		   }
		}
		for(f=0;f>9;f++)
		{
		   if(Sen==f)
		   {
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				PORTA |=  _BV(PA1);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA1);	
			}
		   else
		   {
				PORTA |=  _BV(PA2);
				_delay_loop_1(10);
				PORTA &= ~_BV(PA2);
				
				_delay_loop_1(10);
				
		   }
		}
	}
}
Så blev de. Men funkar fortfarande inte... Dock är det inget "brus" på utgången nu.

Nu vet jag verkligen inte vad som är fel. hehe. Det

Jag har stirrat ett tag på koden. Men kan inte hitta något.

Tusan också. Jag som hade hoppats på att det skulle fungera.
Någon som ser ifall det ser rätt ut?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du kanske kan förklara för mig ovetande vad dessa _BV() är för något...
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Virr3: Du har en väldigt speciell klocka oxo verkar det som. Dina timmar går från 00 till 29....

Fast det är ju ett bra sätt att hinna med mera under dygnet ;-)
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

matseng: Gör de?
Vart ser du de? jag tycker de ser bra ut?:S

Kod: Markera allt

if(++Hen >= 10)
            { 
            Hen = 0; 
            if(++Htio >= 2) Htio = 0; 
            } 
Icecap:

Kod: Markera allt

PORTA |=  _BV(PA2); 
Betyder rätt å slätt, sätt pin3 på port A hög.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Den här loopen kommner du aldrig att komma ur, så allt efter det kommer aldrig att exekveras. CPU'n kommer bara att loopa runt där plus i interruptet (om det nu är rätt konfigurerat). Men det kanske är meningen just nu under debuggingen?

Kod: Markera allt

while(1)
{
   MCUCR = 0xB0;
   _SLEEP();
   _NOP();
   TCCR2=0x05;
   while (ASSR&0x07);
} 
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Ja, jag hade fel. Din klocka räknar inte till 29, den går bara till 19!
Edit: Jag är inte van vid pre-increment, det är lite udda för mig...

Du måste testa både entalen och tiotalen samtidig för att upptäcka att den kommit till 24.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

#define _BV(x) (1<<x)
Skriv svar