Microprocessadores 1º Ano - LECOM Universidade do Minho Dept. De Electrónica Industrial 1 Rotinas e Sub-rotinas • O que é a programação estruturada ? • Como a linguagem assembly do PIC suporta a programação estruturada ? 9 O suporte a estruturação do código é feita através das instruções de ‘call’ e ‘return’. 9 Estrutura de uma rotina: pontoDeEntrada ... return 1 Rotinas e Sub-rotinas • Considere o seguinte código: movf PESO1, W call soma movwf TOTAL1 movf PESO2 call soma movwf TOTAL2 ... fluxo principal de execução ... código do programa entry point call código da rotina mais código return call mais código De que forma o processador realiza a comutação da execução do código entre a rotina e a sub-rotina ? Rotinas e Sub-rotinas • Sabemos que o endereço da instrução a ser executada está armazenado no registo program counter (pc). 9 Por esta razão, o processador é capaz de comutar o ponto de execução através da manipulação do registo pc. 9 Temos então que as instruções de call e return irão manipular o registo pc. 9 A instrução call irá colocar o endereço da rotina que pretendemos chamar em pc, onde a label no início da rotina indica o ponto de entrada. 9 A instrução return, por sua vez, colocará o endereço da instrução a seguir ao call no registo pc. Desta forma a execução será retomada normalmente após a chamada da sub-rotina. 2 Rotinas e Sub-rotinas • Qual é o problema com a descrição anterior ? 9 Na descrição da instrução return foi dito que esta colocará o endereço de retorno, que é o endereço da instrução a seguir ao call da sub-rotina, no registo pc. Mas de que forma a instrução return sabe qual será o endereço de retorno ? 9 Na resolução deste problema, os processadores usam uma memória especial chamada stack. 9 9 O nome stack reflecte o comportamento desta memória que se comporta como uma pilha de dados: LIFO (last in first out) Esta memória é usada pelo processador para armazenar o endereço de retorno. Rotinas e Sub-rotinas • A memória de stack tem um ponteiro que indica o topo da stack. • Este ponteiro chama-se sp, stack pointer. • Após reset este aponta para a posição 0. • No microcontrolador PIC, a memória stack não pode ser manipulada directamente, mas apenas indirectamente através das instruções: call e return. • Como a stack do PIC tem apenas 8 palavras, então não é possível ter uma profundidade de chamada superior a 8. • Alguns processadores tem instruções especiais, push e pop, que permitem usar a memória stack para guardar dados. 3 Rotinas e Sub-rotinas • Considere o seguinte código: ... movf PESO1, W call soma movwf TOTAL1 movf PESO2 call soma movwf TOTAL2 ... • Até ao instante da execução da instrução ‘movf PESO1, W’, ainda não foi efectuado qualquer chamada a subrotinas, logo o stack pointer aponta para o início da stack. Rotinas e Sub-rotinas • Considere o seguinte código: ... movf PESO1, W call soma movwf TOTAL1 soma movf PESO2 call soma movwf TOTAL2 ... • Na execução da instrução ‘call soma’ são executadas as seguintes micro-operações: 1. O endereço da instrução seguinte, ‘movwf TOTAL1’, que se encontra em PC é guardado na stack. 2. O stack pointer é incrementado. 3. O endereço da rotina ‘soma’ é colocado em PC. 4 Rotinas e Sub-rotinas • Considere o seguinte código: soma ... return ... movf call movwf movf call movwf ... PESO1, W soma TOTAL1 PESO2 soma TOTAL2 • Na execução da instrução ‘return’ da rotina ‘soma’ são executadas as seguintes micro-operações: 1. O endereço da instrução guardado na stack é colocado em PC. 2. O stack pointer é decrementado. • A execução retoma com a instrução ‘movwf TOTAL1’ Rotinas e Sub-rotinas Questões ou dúvidas ? 5 Temporizadores / Contadores • Temporizadores e contadores de eventos 9 O PIC16F84A tem uma unidade de temporização e contagem: timer 0 9 O timer 0 pode operar como temporizador ou como contador de eventos externos ao microcontrolador. Temporizadores / Contadores 9 No modo de temporização, o registo TMR0 é incrementado a cada ciclo de instrução, também chamado ciclo de máquina. 9 Notar que cada ciclo de instrução corresponde a 4 ciclos de relógio. 6 Temporizadores / Contadores 9 No modo de contagem, o registo TMR0 do timer é incrementado sempre que há uma transição no pino RA4/T0CKI. 9 O incremento pode ser feito em função de uma transição positiva ou negativa – programável. Temporizadores / Contadores 9 Notas: 9 A contagen dos eventos externos e dos eventos internos (ciclos de relório) é efectuado no registo TMR0. 9 Como este registo é de 8 bits, então a conatgem máxima será de 256 unidades. 9 Sempre que ocorre um overflow, ou seja, quando a contagem passa de 0xFF (255) para 0, o bit T0IF do registo INTCON é activado – ‘1’. 9 Este bit deve ser apagado pelo programador. 7 Temporizadores / Contadores • O uso do registo TMR0 limita as temporizações para 256xTOSC. • O que fazer para conseguir temporizações superiores ? 9 Solução #1 9 9 Posso aumentar a resolução do temporizador por software incrementando uma variável sempre que ocorra um overflow. Solução #2 9 Uso do prescaler. Temporizadores / Contadores • O que é o prescaler ? 8 Temporizadores / Contadores • Principais registos Temporizadores / Contadores 9 Temporizadores / Contadores Temporizadores / Contadores • Considerações práticas: 9 Timer 0 está a operar como temporizador: 9 9 Quando o registo TMR0 é escrito, a contagem deste é parada por dois ciclos de instrução (8 ciclos de relógio). Timer 0 está a operar como contador: 9 Visto o sinal externo ter que ser sincronizado com o relógio interno do PIC verifica-se que: 9 O sinal externo não pode ter um período inferior a 4TOSC (TOSC é o período do relógio do PIC). 9 O incremento do registo de contagem acontecerá com um atraso de dois ciclos de relógio – 2TOSC. 10 Temporizadores / Contadores Questões ou dúvidas ? Temporizadores / Contadores • Problema. 9 Sabendo que dispõe de um sistema com um microcontrolador PIC 16F84A com um cristal de 4 MHz, escreva um programa para gerar uma onda quadrada com uma frequência de 10 KHz. 11